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()がnullになることです!最初に開いたものは常に正しく、null以外ですが、押し戻すと、自動的に生成された設定リストに戻り、2番目のリストをクリックすると、アクティビティがnullになります。

4

2 に答える 2

10

痛い!それは大変でした。私はそれを修正することに成功しました。

実際、リスナーは常に最初のフラグメントに属していました。したがって、他のカテゴリからプリファレンスを変更すると、2番目のフラグメントのプリファレンスを変更すると、最初のフラグメントのリスナーが呼び出されます。

したがって、アクティビティはnullです。

解決策は、フラグメントを離れるときにリスナーを削除して、正しいリスナーが自分の仕事を行えるようにすることです。

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

リスナーがフラグメントMyFragmentにある場合は、次のコードを使用してアクティビティインスタンスを取得します。.this.getActivity()を使用する必要があります

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