В моем приложении я использовал PreferenceFragment для создания приятного приложения на планшетах и смартфонах.getActivity() return null in 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());
}
}
Большая проблема я столкнулся в том, что getActivity() равно нулю, когда у меня есть несколько категорий в моем заголовке XML! Первый, который я открываю, всегда корректен и не равен нулю, но когда я нажимаю, я возвращаюсь в список предпочтений, автоматически генерируемый, я нажимаю на второй, и там активность равна нулю!
Это устранило проблему, с которой я столкнулся. Функция getActivity отлично работала, кроме как в случае возврата к активности, в которой размещался фрагмент. В моем случае мне также необходимо было зарегистрировать слушателя снова в onResume, как описано здесь http://developer.android.com/guide/topics/ui/settings.html#Listening. Спасибо за публикацию решения. – ndsc
Спасибо за решение. Но я бы использовал его на onStop(). – Dpedrinha
На самом деле вам следует отменить регистрацию в 'onDestroy' /' onStop', если вы зарегистрировали его в 'onCreate' /' onStart'. Если вы зарегистрировали его в 'onResume', то отмена регистрации в' onPause' будет работать нормально. – Mygod