2012-07-24 27 views
1

隨着首選項的更改,我在更新SharedPreferences中的總結行時遇到了一些問題。我在onResume()中註冊了OnSharePreferenceChangeListener,並在onPause()中註冊了相同的註銷。Android:通過監聽器更新sharedPreferences總結

監聽程序正在運行,我可以使用onSharedPreferenceChanges()方法。我遇到的問題是能夠檢索那裏的偏好,以便我可以調用setSummary()。我在冰淇淋三明治,似乎findPreference(key)方法已被棄用。因此:

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
Preference pref = findPreference(key);} 

不起作用,實際上對於pref返回null。從我見過的例子中,您需要首先調用setSummary()以及想法?

+0

'findPreference'不被棄用,而是你不應該使用'PreferenceActivity'(已棄用)。如果你只需要支持Android 3.0+,那麼你應該切換到'PreferenceFragment'。 – nebkat 2012-07-24 21:35:54

回答

5

您不應該爲此使用onSharedPreferenceChangedListener

相反,使用類似的東西。

ListPreference myPreference = (ListPreference) findPreference("preference_key"); 
myPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
    @Override 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
     if (((String)newValue).equals("some_value")) { 
      preference.setSummary("my summary"); 
     } 
    } 
}); 

findPreference不會被棄用,而是你不應該使用PreferenceActivity(即不建議使用)。如果你只需要支持Android 3.0+,那麼你應該切換到PreferenceFragment的新方法。如果你需要支持Android 2.1+,那麼它很好,你可以忽略這些警告。

+0

我明白了。但有幾個問題: – Mick0311 2012-07-24 21:38:46

+1

這將需要我爲每個首選項設置正確的偵聽器?我在整個程序中有很多偏好,這就是我使用sharedPreferences的原因。 此外,我認爲你正在使用的findPreference(「Preference_key」)是已棄用的。 ;) – Mick0311 2012-07-24 21:46:09

+0

'((String)newValue)' - 這個投射是多餘的。 – Prince 2015-05-05 10:17:52

3

我一直試圖在我的代碼中使用PreferenceFragment,並且我也看到findPreference(key)返回nullSettings documentation page上使用OnSharedPreferenceChangeListener的示例代碼尚未完全更新爲PreferenceFragment,如果逐字使用它,則會崩潰到NullPointerException

我終於明白了:您必須通過PreferenceFragment找到Preference,因爲當然這就是偏好現在的位置。後見之明。像這樣:

public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener 
{ 
    protected SettingsFragment settingsFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     settingsFragment = new SettingsFragment(); 
     getFragmentManager().beginTransaction().replace(android.R.id.content, settingsFragment).commit(); 
    } 

    // ... 

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     if (key.equals("your_key")) { 
      String newValue = sharedPreferences.getString(key, ""); 
      settingsFragment.findPreference(key).setSummary(newValue); 
     } 
    } 
} 
+0

bjnord,這正是我的問題,我相信你的答案是可行的,但是爲了啓用這個監聽器,示例代碼告訴用getPreferenceScreen()在onResume()和onPause()中註冊getSharedPreferences() .registerOnSharedPreferenceChangeListener(本);但此代碼崩潰,因爲這最後一個方法給我NullPointerException。你是否使用其他方式來啓用偵聽器?謝謝 – user23 2013-03-11 18:53:49

+0

給我NullPointerException僅適用於Android 3.0+,對於Api <11它運行良好,因爲findpreference()。 – user23 2013-03-11 19:10:00