2012-01-18 5 views
4

В моем приложении я использовал 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! Первый, который я открываю, всегда корректен и не равен нулю, но когда я нажимаю, я возвращаюсь в список предпочтений, автоматически генерируемый, я нажимаю на второй, и там активность равна нулю!

ответ

10

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

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

Таким образом, действие равно null.

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

@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

+0

Спасибо за решение. Но я бы использовал его на onStop(). – Dpedrinha

+0

На самом деле вам следует отменить регистрацию в 'onDestroy' /' onStop', если вы зарегистрировали его в 'onCreate' /' onStart'. Если вы зарегистрировали его в 'onResume', то отмена регистрации в' onPause' будет работать нормально. – Mygod

-1

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

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

в его случае я считаю, что это все равно будет нулевым, так как фрагмент отделяется от деятельности –