getActivity () возвращает ноль в PreferenceFragment - PullRequest
4 голосов
/ 18 января 2012

В своем приложении я использовал PreferenceFragment для создания симпатичного приложения на планшетах и ​​смартфонах.

Итак, в своей основной деятельности я использую:

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

Мой XML-файл выглядит такthis:

<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());
        }

    }

Большая проблема, с которой я сталкиваюсь, заключается в том, что getActivity () имеет значение null, когда в моем заголовке xml есть несколько категорий!Первый, который я открываю, всегда правильный и ненулевой, но когда я нажимаю назад, я возвращаюсь к автоматически созданному списку предпочтений, я нажимаю второй, и там, активность равна нулю!

Ответы [ 2 ]

10 голосов
/ 19 января 2012

ОЙ!Это было сложно.Мне удается это исправить.

На самом деле, Слушатель всегда принадлежал к первому Фрагменту.Поэтому, когда вы изменяете Предпочтение из другой категории, слушатель первого Фрагмента вызывается, когда вы изменяете Предпочтение второго Фрагмента!

Таким образом, Активность равна нулю.

Решениеудалить слушателя, когда вы оставляете фрагмент, чтобы правильный слушатель мог выполнить свою работу:

@Override
public void onPause() {
    super.onPause();
    Log.i("", "PAUSE");
    preferences.unregisterOnSharedPreferenceChangeListener(this);
}
0 голосов
/ 18 января 2012

Если ваш прослушиватель находится во фрагменте MyFragment, используйте следующий код для получения экземпляра действия. Нам нужно использовать .this.getActivity ()

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {
    Log.i("", "PREFChanged "+ MyFragment.this.getActivity());
    .....
}
...