2010-09-01 12 views
9

Ho un Preference che abilita un adattatore di sincronizzazione e richiede un po 'di tempo per eseguire il proprio lavoro quando attivato. Di conseguenza, quando l'utente fa clic su Preference, eseguo un AsyncTask per eseguire il lavoro. Nel frattempo, disabilito lo Preference e sostituisco la casella di spunta con un numero indeterminato ProgressBar. Tutto questo funziona tramite un hack che coinvolge una sottoclasse di CheckBoxPreference che si sovrappone allo ProgressBar in cima allo CheckBox. Che schifo.Personalizzazione di CheckBoxPreference tramite Android: widgetLayout

L'attributo android:widgetLayout sembra progettato esattamente per questo. Dovrei essere in grado di utilizzare android:widgetLayout per specificare una sostituzione per il valore predefinito CheckBox. Tale sostituzione implementerebbe Checkable e utilizzerà uno ViewSwitcher per passare in modo appropriato tra uno CheckBox e uno ProgressBar.

L'unico problema è che CheckBoxPreference, nel suo metodo onBindView(), sembra ignorare la possibilità che sia possibile utilizzare android:widgetLayout. Lo fa in modo esplicito questo:

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

Questo rende effettivamente impossibile scambiare in un costume Checkable via android:widgetLayout e lo hanno effettivamente lavoro.

Si tratta di una svista/bug in CheckBoxPreference o ho frainteso android:widgetLayout? Esiste un modo più pulito per fare ciò che sto cercando di fare?

+0

Hai mai trovato una soluzione a questo? L'ho colpito anche io. –

+0

Non proprio. Ho bloccato con [la mia sottoclasse] (https://github.com/loganj/foursquared/blob/master/main/src/com/joelapenna/foursquared/preferences/ProgressCheckBoxPreference.java) di 'CheckBoxPreference'. – loganj

risposta

0

android: widgetLayout è la parte giusta della preferenza. In CheckBoxPreference, il widgetLayout è la casella di controllo. Se si prende un Preferenza di base e mettere un ViewSwitcher nel widgetLayout, dovrebbe funzionare

+0

Certo, ma poi mi mancano le cose che CheckBoxPreference fa, come riassunti e accessibilità. – loganj

11
  1. In primo luogo, sono d'accordo con te che Android dovrebbe refactoring del pezzo di codice view.findViewById(com.android.internal.R.id.checkbox); a "chiamare un metodo protetto", che può essere superato dalla sottoclasse.

  2. Per fortuna, siamo ancora in grado di sostituire il lavoro in giro come segue: L'idea è semplice: dichiarare una casella di controllo che ha id è Android di default id @android:id/checkbox

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

e in uscita personalizzata.xml:

<SwitchView>
...
<CheckBox>

android: id = "@android: id/casella "
android: layout_width =" wrap_content"
android: layout_height = "wrap_content"
android: text =" mycheck"
android: cliccabile = "false"
android: attivabile = "false"
Android: focusab leInTouchMode = "false"
</CheckBox>

E 'molto importante notare che attributi focusable della casella di controllo deve essere impostato su false (penso che il layout di default della CheckBoxPreference fa la stessa cosa) in modo che la lista apdater riceve evento piuttosto che la casella di controllo stessa. Immagino che non hai avuto successo nel tuo tentativo solo perché non hai impostato lo stato di messa a fuoco.

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

+0

Fantastico! Funziona. Grazie per aver menzionato di metterli a "false". – Sdghasemi

Problemi correlati