通过android:widgetLayout自定义CheckBoxPreference

log*_*anj 9 android preference

我有一个Preference启用同步适配器,并在切换时需要一段时间来实际工作.因此,当用户单击时Preference,我会关闭AsyncTask来完成工作.在此期间,我禁用Preference并替换复选框与不确定ProgressBar.我所有这一切都是通过一个涉及一个子类的黑客CheckBoxPreference来覆盖它的ProgressBar顶部CheckBox.呸.

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

唯一的问题是CheckBoxPreference,在其onBindView()方法中,似乎忽略了可能android:widgetLayout使用的可能性.它明确地这样做:

View checkboxView = view.findViewById(com.android.internal.R.id.checkbox);
Run Code Online (Sandbox Code Playgroud)

这实际上使得无法交换自定义Checkable通道android:widgetLayout并使其实际工作.

这是一个疏忽/错误CheckBoxPreference,还是我误解了android:widgetLayout?是否有更清洁的预期方式来做我想做的事情?

gre*_*sse 11

  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>

注意checkbox的可聚焦属性必须设置为false(我猜CheckBoxPreference的默认布局做同样的事情)非常重要,这样list apdater会接收事件而不是复选框本身.我猜你的尝试没有成功,因为你没有设置可聚焦状态.

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


fed*_*edj 0

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