10

同期アダプターを有効にPreferenceする があり、切り替えたときに実際に機能するまでに時間がかかります。したがって、ユーザーが をクリックするPreferenceと、AsyncTask をスピンオフして作業を行います。それまでの間、 を無効にPreferenceして、チェック ボックスを indeterminate に置き換えますProgressBar。の上にCheckBoxPreferenceオーバーレイする のサブクラスを含むハックを介して、これらすべてを機能させています。うん。ProgressBarCheckBox

このandroid:widgetLayout属性は、まさにこのために設計されているようです。android:widgetLayoutデフォルトの代わりを指定するために使用できるはずですCheckBox。この置換は、 aと aを適切に切り替えるCheckableために a を実装して使用します。 ViewSwitcherCheckBoxProgressBar

唯一の問題はCheckBoxPreference、そのonBindView()方法では、 が使用される可能性を無視しているように見えることandroid:widgetLayoutです。明示的にこれを行います:

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

Checkableこれにより、カスタムビアを交換しandroid:widgetLayoutて実際に機能させることが事実上不可能になります。

これは見落とし/バグですかCheckBoxPreference、それとも誤解android:widgetLayoutですか? 私がやろうとしていることを行うためのよりクリーンな方法はありますか?

4

2 に答える 2

12
  1. view.findViewById(com.android.internal.R.id.checkbox);まず、サブクラスでオーバーライドできる「保護されたメソッドを呼び出す」ようにAndroid がコードをリファクタリングする必要があることに同意します。

  2. 幸いなことに、次のように回避策をオーバーライドすることができます:@android:id/checkbox

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

そしてcustomlayout.xmlで:

<SwitchView>
...
<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 ="偽"
</CheckBox>

チェックボックスのフォーカス可能な属性を false に設定する必要があることに注意することが非常に重要です (CheckBoxPreference のデフォルトのレイアウトは同じことを行うと思います)。これにより、リスト apdater はチェックボックス自体ではなくイベントを受け取ります。フォーカス可能な状態を設定しなかったという理由だけで、あなたの試みは成功しなかったと思います。

グリーンスイス
(https://sites.google.com/site/greensuisse/)

于 2012-03-04T15:43:21.087 に答える
0

android:widgetLayoutは設定の正しい部分です。CheckBoxPreferenceでは、widgetLayoutがチェックボックスです。基本プリファレンスを取得し、widgetLayoutにViewSwitcherを配置すると、機能するはずです。

于 2010-09-01T13:24:08.707 に答える