2012-01-18 18 views
4

私のアプリケーションでは、PreferenceFragmentを使用して、タブレットとスマートフォンですばらしいアプリケーションを作成しました。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()); 
     } 

    } 

大きな問題は、私は私のXMLヘッダ内に複数のカテゴリがある場合getActivity()がnullであるということです! 私が最初に開いたのは、常に正確で非ヌルですが、私が後ろを押すと、自動的に生成されたプリファレンス・リストに戻ってきて、もう1つをクリックします。

答えて

10

OUCH!それは難しいものでした。 私はそれを解決することに成功しました。

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

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

ソリューションは、あなたが断片を離れるときに正しいリスナーが彼の仕事を行うことができますので、リスナーを削除することです:フラグメントが活動から切り離されているので、私はそれがまだnullのだろうと考えている彼の場合で

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

これは私が持っていた問題を解決しました。 getActivityは、フラグメントをホストしたアクティビティに戻る場合を除いて正常に機能しました。私の場合、http://developer.android.com/guide/topics/ui/settings.html#Listeningに記載されているように、リスナーをonResumeに再度登​​録する必要もありました。ソリューションを投稿していただきありがとうございます。 – ndsc

+0

解決に感謝します。しかし、私はonStop()でそれを使用します。 – Dpedrinha

+0

実際に 'onCreate' /' onStart'に登録した場合は、 'onDestroy' /' onStop'でそれを登録解除する必要があります。 'onResume'に登録した場合、' onPause'で登録を解除するとうまく動作します。 – Mygod

-1

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

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

を –

関連する問題