在我的應用程序中,我使用PreferenceFragment在Tablets和智能手機上創建了一個漂亮的應用程序。getActivity()在PreferenceFragment中返回null
所以,在我的主要活動中,我使用:
@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 2013-11-23 10:52:18
感謝您的解決方案。但是我會在onStop()上使用它。 – Dpedrinha 2014-04-24 17:37:56
實際上,如果你在'onCreate' /'onStart'中註冊它,你應該在'onDestroy' /'onStop'中註銷它。如果您在'onResume'中註冊它,則在'onPause'中註銷將會正常工作。 – Mygod 2015-12-27 02:18:50