2010-09-01 133 views
9

我有一个Preference,它启用了一个同步适配器,并且在切换时需要一段时间才能真正完成它的工作。因此,当用户点击Preference时,我分离出一个AsyncTask来完成这项工作。与此同时,我禁用了Preference,并用不确定的ProgressBar替换了复选框。我通过涉及CheckBoxPreference的子类的一个破解工作,将ProgressBar覆盖在CheckBox之上。呸。通过android自定义CheckBoxPreference:widgetLayout

android:widgetLayout属性看起来像是专门为此设计的。我应该可以使用android:widgetLayout来指定替代默认CheckBox。所述替换将执行Checkable并使用ViewSwitcherCheckBoxProgressBar之间适当切换。

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

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

这实际上使得它无法在自定义Checkable通过android:widgetLayout交换,并有实际工作。

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

+0

你有没有找到一个解决这个?我也打过了。 – 2011-06-29 14:35:51

+0

不是。我坚持使用CheckBoxPreference的[我的子类](https://github.com/loganj/foursquared/blob/master/main/src/com/joelapenna/foursquared/preferences/ProgressCheckBoxPreference.java)。 – loganj 2011-07-17 16:52:40

回答

0

android:widgetLayout是首选项的正确部分。在CheckBoxPreference中,widgetLayout是复选框。 如果你把基地偏好,把一个ViewSwitcher在widgetLayout,它应该工作

+0

当然,但是我错过了CheckBoxPreference的东西,就像摘要和可访问性一样。 – loganj 2010-09-01 13:53:16

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" />

和自定义布局中。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/)

+0

太棒了!有用。感谢提及把它们放在'错误的'。 – Sdghasemi 2015-07-13 05:08:35