2010-09-01 10 views
9

Tengo un Preference que habilita un adaptador de sincronización, y tarda un tiempo en hacer su trabajo cuando está activado. En consecuencia, cuando el usuario hace clic en Preference, hago girar una AsyncTask para hacer el trabajo. Mientras tanto, desactivo el Preference y reemplace la casilla de verificación con un ProgressBar indeterminado. Tengo todo esto funcionando a través de un truco que implica una subclase de CheckBoxPreference que se superpone al ProgressBar en la parte superior del CheckBox. Yuck.Personalizar CheckBoxPreference a través de android: widgetLayout

El atributo android:widgetLayout parece que está diseñado exactamente para esto. Debería poder usar android:widgetLayout para especificar un reemplazo para el CheckBox predeterminado. Dicho reemplazo implementaría Checkable y usa un ViewSwitcher para cambiar apropiadamente entre un CheckBox y un ProgressBar.

El único problema es que CheckBoxPreference, en su método onBindView(), parece ignorar la posibilidad de que android:widgetLayout se pueda utilizar. Lo hace de forma explícita esto:

View checkboxView = view.findViewById(com.android.internal.R.id.checkbox); 

Esto efectivamente hace que sea imposible de cambiar de una costumbre Checkable través android:widgetLayout y tienen realmente funciona.

¿Esto es un descuido/error en CheckBoxPreference, o he entendido mal android:widgetLayout? ¿Hay una manera más limpia de hacer lo que estoy tratando de hacer?

+0

¿Alguna vez encontrar una solución a esto? Acabo de golpearlo también. –

+0

No realmente. Me quedé con [mi subclase] (https://github.com/loganj/foursquared/blob/master/main/src/com/joelapenna/foursquared/preferences/ProgressCheckBoxPreference.java) de 'CheckBoxPreference'. – loganj

Respuesta

0

android: widgetLayout es la parte correcta de la preferencia. En CheckBoxPreference, el widgetLayout es la casilla de verificación. Si se toma una Preferencia base y pone un ViewSwitcher en el widgetLayout, que debería funcionar

+0

Claro, pero luego me pierdo el material CheckBoxPreference, como resúmenes y accesibilidad. – loganj

11
  1. En primer lugar, estoy de acuerdo con usted en que Android debe refactorizar el trozo de código view.findViewById(com.android.internal.R.id.checkbox); a "llamar a un método protegido", que puede ser anulado por subclase.

  2. Por suerte, todavía somos capaces de anular el trabajo alrededor de la siguiente manera: La idea es simple: declarar una casilla de verificación que tiene ID es ID predeterminado androide @android:id/checkbox

<CheckBoxPreference
android:key="autostart"
android:widgetLayout="@layout/customlayout" />

y en diseño personalizado.xml:

<SwitchView>
...
<CheckBox>

android: id = "@android: id/casilla de verificación "
androide: layout_width =" wrap_content"
androide: layout_height = "wrap_content"
android: text =" mycheck"
androide: se puede hacer clic = "true"
androide: enfocable = "true"
androide: focusab leInTouchMode = "false"
</CheckBox>

Es muy importante tener en cuenta que atributos enfocable de casilla se deben establecer en falso (supongo que el diseño predeterminado de CheckBoxPreference hace lo mismo) para que la lista Apdater recibe evento en lugar de la casilla de verificación en sí. Supongo que no tuvo éxito en su intento solo porque no estableció el estado enfocable.

greensuisse
(https://sites.google.com/site/greensuisse/)

+0

¡Impresionante! Funciona. Gracias por mencionarlos para ponerlos a 'falso'. – Sdghasemi

Cuestiones relacionadas