Настройка CheckBoxPreference через Android: widgetLayout - PullRequest
9 голосов
/ 01 сентября 2010

У меня есть 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? Есть ли более чистый способ сделать то, что я пытаюсь сделать?

Ответы [ 2 ]

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

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

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

и в customlayout.xml:

<SwitchView><br> ...<br> <CheckBox>
android: id = " @ android: id / checkbox "
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "mycheck"
android: clickable = "false"
android: focusable = "false "
android: focusableInTouchMode =" false "
</CheckBox>

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

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

0 голосов
/ 01 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...