1

随着首选项的更改,我在更新 SharedPreferences 中的摘要行时遇到了一些问题。我在 onResume() 中有一个注册的 OnSharePreferenceChangeListener,在 onPause() 中有一个相同的注销。

侦听器正在运行,我可以使用 onSharedPreferenceChanges() 方法。我遇到的问题是能够在那里检索首选项,以便我可以调用 setSummary()。我在 Ice Cream Sandwich,看起来好像 findPreference(key) 方法已被弃用。所以:

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

不起作用,实际上为 pref 返回 null。从我看到的示例中,您需要优先调用 setSummary() ,以及想法?

4

2 回答 2

5

您不应该onSharedPreferenceChangedListener为此使用 an 。

相反,使用与此类似的东西。

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没有被弃用,而是你不应该使用 a PreferenceActivity(已弃用)。如果您只需要支持Android 3.0+,那么您应该切换到PreferenceFragment新方法's。如果您需要支持 Android 2.1+,那很好,您可以忽略警告。

于 2012-07-24T21:33:48.363 回答
3

我一直在尝试PreferenceFragment在我的代码中使用,我也看到了findPreference(key)return null设置文档页面上用于使用的示例代码OnSharedPreferenceChangeListener尚未完全更新,如果您逐字使用它PreferenceFragment,您将崩溃。NullPointerException

我终于想通了:你必须找到Preferencevia the,PreferenceFragment因为当然这就是现在的偏好。事后看来很明显。像这样的东西:

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);
        }
    }
}
于 2012-10-09T14:12:42.340 回答