10

我有一个Preference启用同步适配器的设备,并且在切换时需要一段时间才能真正完成它的工作。因此,当用户单击 时Preference,我会启动一个 AsyncTask 来完成这项工作。同时,我禁用了Preference复选框并将复选框替换为不确定的ProgressBar. 我通过一个涉及CheckBoxPreference覆盖ProgressBarCheckBox. 呸。

android:widgetLayout属性似乎正是为此而设计的。我应该可以android:widgetLayout用来指定默认的替换CheckBox。所述替换将实现Checkable并使用 a在 a和 aViewSwitcher之间适当切换。 CheckBoxProgressBar

唯一的问题是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. 首先,我同意你的观点,Android 应该将这段代码重构view.findViewById(com.android.internal.R.id.checkbox);为“调用受保护的方法”,它可以被子类覆盖。

  2. 幸运的是,我们仍然能够按如下方式覆盖工作:这个想法很简单:声明一个 id 为 android 默认 id 的复选框@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 接收事件而不是复选框本身。我猜你的尝试没有成功,只是因为你没有设置可聚焦状态。

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

于 2012-03-04T15:43:21.087 回答
0

android:widgetLayout 是首选项的正确部分。在 CheckBoxPreference 中,widgetLayout 是复选框。如果您采用基本首选项并将 ViewSwitcher 放在 widgetLayout 中,它应该可以工作

于 2010-09-01T13:24:08.707 回答