Настройка CheckBoxPreference через android: widgetLayout

У меня есть Preference которое позволяет адаптеру синхронизации, и занимает некоторое время, чтобы фактически выполнить свою работу при переключении. Следовательно, когда пользователь нажимает кнопку « Preference , я отжимаю AsyncTask для выполнения этой работы. Тем временем я отключу опцию Preference и поставлю флажок с неопределенным ProgressBar . У меня все это работает с помощью взлома с подклассом CheckBoxPreference который накладывает ProgressBar поверх CheckBox . Тьфу.

android:widgetLayout кажется, что он разработан именно для этого. Я должен иметь возможность использовать android:widgetLayout чтобы указать замену по умолчанию CheckBox . Указанная замена будет выполнять Checkable и использовать ViewSwitcher для переключения между CheckBox и ProgressBar .

Единственная проблема заключается в том, что CheckBoxPreference в своем onBindView() , похоже, игнорирует возможность использования android:widgetLayout . Он явно делает это:

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

Это фактически делает невозможным свопинг в пользовательском Checkable через android:widgetLayout и действительно ли он работает.

Является ли это надзором / ошибкой в CheckBoxPreference , или я неправильно понял android:widgetLayout ? Есть ли более чистый способ сделать то, что я пытаюсь сделать?

  1. Во-первых, я согласен с вами в том, что Android должен реорганизовать фрагмент кода view.findViewById(com.android.internal.R.id.checkbox); На «вызов защищенного метода», который может быть переопределен подклассом.

  2. К счастью, мы все еще можем переопределить работу следующим образом: идея проста: объявить флажок с идентификатором id по умолчанию id android @android:id/checkbox

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

И в customlayout.xml:

<SwitchView>
...
<CheckBox>

Android: id = " @android: id / checkbox "
андроид: layout_width = "wrap_content"
андроид: layout_height = "wrap_content"
Android: текст = "mycheck"
андроид: кликабельны = «ложь»
андроид: фокусируемый = «ложь»
андроид: focusableInTouchMode = "ложь"
</CheckBox>

Очень важно отметить, что настраиваемые атрибуты флажка должны быть установлены на false (я думаю, что макет по умолчанию для CheckBoxPreference делает то же самое), чтобы список apdater получал событие, а не флажок. Я думаю, вы не добились успеха в своей попытке, потому что вы не установили фокусируемое состояние.

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

Android: widgetLayout – это правильная часть предпочтения. В CheckBoxPreference флажок widgetLayout – это флажок. Если вы берете базовое предпочтение и помещаете ViewSwitcher в widgetLayout, он должен работать