4

在我的应用程序中,我使用 PreferenceFragment 在平板电脑和智能手机上创建了一个不错的应用程序。

所以,在我的主要活动中,我使用:

@Override
public void onBuildHeaders(List<Header> target) {
    loadHeadersFromResource(R.xml.preference_headers, target);
}

我的 xml 文件如下所示:

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
    <header android:fragment="tof.cv.mpp.view.StockPreferenceFragment"
        android:title="@string/btn_home_settings" android:summary="">
        <extra android:name="resource" android:value="activity_preferences" />
    </header>
    <header android:fragment="tof.cv.mpp.view.StockPreferenceFragment"
        android:title="@string/btn_home_planner" android:summary="">
        <extra android:name="resource" android:value="activity_planner_preferences" />
    </header>
    <header android:fragment="tof.cv.mpp.view.StockPreferenceFragment"
        android:title="@string/btn_home_twitter" android:summary="">
        <extra android:name="resource" android:value="activity_twitter_preferences" />
    </header>
</preference-headers>

现在的问题是我想使用 OnSharedPreferenceChangeListener 来更新我的一些偏好的摘要。

我用:

@Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        Log.i("", "PREFChanged "+getActivity());
        if (key.contentEquals("prefPseudo")) {
            Log.i("", "PseudoChanged");
            Preference pref = findPreference("prefPseudo");
            pref.setSummary(((EditTextPreference) pref).getText());
        }
        if (key.contentEquals(getString(R.string.key_activity))) {
            Log.i("", "FirstChanged");
            Preference pref = findPreference(getString(R.string.key_activity));
            pref.setSummary(((ListPreference) pref).getEntry());
        }
        if (key.contentEquals(getString(R.string.key_planner_da))) {
            Preference pref = findPreference(getString(R.string.key_planner_da));
            Log.i("", "PlannerChanged"+pref);
            pref.setSummary(((ListPreference) pref).getEntry());
        }

    }

我面临的最大问题是当我的 xml 标头中有多个类别时 getActivity() 为空!我打开的第一个总是正确且非空的,但是当我按下返回时,我回到自动生成的首选项列表,我单击第二个并在那里,活动为空!

4

2 回答 2

10

哎哟!那是一个艰难的过程。我成功地解决了这个问题。

事实上,Listener 一直属于第一个 Fragment。因此,当您从其他类别更改 Preference 时,当您更改第二个 Fragment 的 Preference 时,将调用第一个 Fragment 的侦听器!

所以 Activity 为空。

解决方案是在您离开 Fragment 时删除侦听器,以便正确的侦听器可以完成他的工作:

@Override
public void onPause() {
    super.onPause();
    Log.i("", "PAUSE");
    preferences.unregisterOnSharedPreferenceChangeListener(this);
}
于 2012-01-18T22:16:06.453 回答
-1

如果您的 Listener 在 Fragment MyFragment 中,请使用以下代码获取活动实例。我们需要使用 .this.getActivity()

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {
    Log.i("", "PREFChanged "+ MyFragment.this.getActivity());
    .....
}
于 2012-01-18T17:34:29.233 回答