2012-07-24 110 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