2016-01-13 89 views
0

我已經拿起別人的代碼,並能夠最終使其工作!現在,我正在研究我的應用的PreferencesActivity。據他的代碼,其他人是在onResume()設置onSharedPreferenceChangeListener,並在onPause()像這樣將其取出:使用registerOnSharedPreferenceChangeListener

protected void onResume(){ 
    super.onResume(); 
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
} 

@Override 
protected void onPause(){ 
    super.onPause(); 
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); 
} 

它產生錯誤NullPointerException並且它也被廢棄。我將使用它與我的PreferenceFragment,但我想知道爲什麼此代碼在那裏,它可能是什麼使用,以及如何解決它,並使其工作。

+1

我假設的代碼片段應該說'getSharedPreferences()'而不是'getSharedPreferences'? –

+0

是的,修復它,複製粘貼的東西了o.O – dequec64

+0

在類中有'onSharedPreferencesChanged(SharedPreferences sharedPreferences,String key)'方法嗎? –

回答

0

看來問題是由於使用自定義類(只有一個理論)造成的。在代碼中匿名使用接口(而不是在主類中實現它)似乎可以解決這個問題。

SharedPreferences.OnSharedPreferenceChangeListener prefListener = 
     new SharedPreferences.OnSharedPreferenceChangeListener() { 
    public void onSharedPreferenceChanged(SharedPreferences prefs, 
      String key) { 
     if (key.equals("date")) { 
     } 
    } 
}; 
preferences.registerOnSharedPreferenceChangeListener(prefListener); 

請注意:重要的是,把選項監聽器變量是一個類字段,而不是一個局部變量,如果它得到垃圾收集。

Source對於答案的一部分)