2012-01-18 120 views
4

在我的應用程序中,我使用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頭! 我打開的第一個總是正確且非空,但是當我按回時,我會回到自動生成的偏好列表中,我點擊第二個並在那裏,活動爲空!

回答

10

OUCH!這是一個艱難的。 我成功解決了這個問題。

事實上,聽衆總是屬於第一個片段。 因此,當您從其他類別更改首選項時,當您更改第二個片段的首選項時,會調用第一個片段的偵聽器!

所以活動爲空。

解決的辦法是當你離開一個片段刪除監聽,所以正確的監聽器可以做他的工作:

@Override 
public void onPause() { 
    super.onPause(); 
    Log.i("", "PAUSE"); 
    preferences.unregisterOnSharedPreferenceChangeListener(this); 
} 
+1

這解決了我遇到的問題。除了返回承載片段的活動的情況外,getActivity正常工作。在我的情況下,我還需要在onResume中再次註冊監聽器,如http://developer.android.com/guide/topics/ui/settings.html#Listening所述。感謝您發佈解決方案。 – ndsc 2013-11-23 10:52:18

+0

感謝您的解決方案。但是我會在onStop()上使用它。 – Dpedrinha 2014-04-24 17:37:56

+0

實際上,如果你在'onCreate' /'onStart'中註冊它,你應該在'onDestroy' /'onStop'中註銷它。如果您在'onResume'中註冊它,則在'onPause'中註銷將會正常工作。 – Mygod 2015-12-27 02:18:50

-1

如果您的偵聽器位於碎片MyFragment中,請使用以下代碼來獲取活動實例。我們需要使用.this.getActivity()

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

在他的情況,我相信它仍然是零,因爲該片段從活動分開 – 2012-02-17 19:19:22

相關問題