2010-09-01 63 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