通过android自定义CheckBoxPreference:widgetLayout
我有一个Preference
,它启用了一个同步适配器,并且在切换时需要一段时间才能真正完成它的工作。因此,当用户点击Preference
时,我分离出一个AsyncTask来完成这项工作。与此同时,我禁用了Preference
,并用不确定的ProgressBar
替换了复选框。我通过涉及CheckBoxPreference
的子类的一个破解工作,将ProgressBar
覆盖在CheckBox
之上。呸。通过android自定义CheckBoxPreference:widgetLayout
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
?有没有一种更清洁的方法来做我想做的事情?
android:widgetLayout是首选项的正确部分。在CheckBoxPreference中,widgetLayout是复选框。 如果你把基地偏好,把一个ViewSwitcher在widgetLayout,它应该工作
当然,但是我错过了CheckBoxPreference的东西,就像摘要和可访问性一样。 – loganj 2010-09-01 13:53:16
首先,我同意你说的Android应该重构的代码段
view.findViewById(com.android.internal.R.id.checkbox);
为“调用保护法”,它可以是被子类覆盖。幸运的是,我们依然能够围绕覆盖工作如下: 的想法很简单:声明拥有ID的复选框的Android默认ID
@android:id/checkbox
<CheckBoxPreference
android:key="autostart"
android:widgetLayout="@layout/customlayout" />
和自定义布局中。XML:
<SwitchView>
...
<CheckBox>
机器人:ID = “@android:ID /复选框 ”
的android:layout_width =“ WRAP_CONTENT”
机器人:layout_height = “WRAP_CONTENT”
机器人:文字=” mycheck”
机器人:可点击= “假”
机器人:可调焦= “假”
机器人:focusab leInTouchMode =“假”</CheckBox>
需要注意的是复选框可聚焦属性必须假(我猜CheckBoxPreference的默认布局做同样的事情),这样名单apdater接收被设置为这真的很重要事件而不是复选框本身。 我想你没有成功,只是因为你没有设置可调焦状态。
greensuisse
(https://sites.google.com/site/greensuisse/)
太棒了!有用。感谢提及把它们放在'错误的'。 – Sdghasemi 2015-07-13 05:08:35
你有没有找到一个解决这个?我也打过了。 – 2011-06-29 14:35:51
不是。我坚持使用CheckBoxPreference的[我的子类](https://github.com/loganj/foursquared/blob/master/main/src/com/joelapenna/foursquared/preferences/ProgressCheckBoxPreference.java)。 – loganj 2011-07-17 16:52:40