我在首选项屏幕中创建了一个首选项,如下所示:
- <PreferenceScreen>
- <Preference
- android:title="title"
- android:key="key"
- android:widgetLayout="@layout/someview"/>
- </PreferenceScreen>
在这里,我设置了一个widgetlayout资源,该资源应显示在首选项的右侧(如复选框首选项的复选框).我也可以在我的PreferenceActivity.onCreate()的代码中设置这个资源,如下所示:
- Preference myPreference = findPreference("key");
- myPreference.setWidgetLayoutResource(R.layout.someview);
这两种方法都可以正常工作,因此我可以在首选项右侧看到我的资源.
但是,我无法访问此资源(someview)以在运行时更改其属性.
无论是手动设置资源ID,从资源或findViewById充气它似乎都工作 – 我有无效的资源/资源ID未找到异常.似乎偏好活动稍后会使资源膨胀.
有没有人遇到同样的问题?有关如何在运行时更改widgetlayout资源属性的任何想法?
这是一个类似的问题,但没有得到回答
> [android-developers] problem accessing widget in Preference widgetLayout
解决方法
我似乎有同样的问题,我尝试这样:
1)创建自定义首选项并覆盖onBindView():
- public class ProgressBarPreference extends Preference {
- private ProgressBar mProgressBar;
- // constructors
- @Override
- protected void onBindView(View view) {
- super.onBindView(view);
- mProgressBar = (ProgressBar) view.findViewById(R.id.progressBar);
- }
- public ProgressBar getProgressBar() {
- return mProgressBar;
- }
- }
2)将此首选项添加到屏幕xml:
- <package.ProgressBarPreference
- android:key="key"
- android:summary="summary"
- android:title="title"
- android:widgetLayout="@layout/preference_widget_progressbar" />
preference_widget_progressbar.xml
- <?xml version="1.0" encoding="utf-8"?>
- <ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/progressBar"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center" />
或者调用setWidgetLayoutResource().
3)onPreferenceTreeClick()时获取ProgressBar:
- if (preference instanceof ProgressBarPreference) {
- ProgressBar progressBar = ((ProgressBarPreference) preference).getProgressBar();
- // TODO something
- }
但是,一年多了!