【问题标题】:Android: Updating sharedPreferences Summary via listenerAndroid:通过侦听器更新 sharedPreferences 摘要
【发布时间】:2012-07-24 21:18:53
【问题描述】:

在首选项更改时更新 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() 的偏好,以及想法?

【问题讨论】:

  • findPreference 未被弃用,但您不应该使用 PreferenceActivity (已弃用)。如果你只需要支持Android 3.0+那么你应该切换到PreferenceFragment的。

标签: android sharedpreferences summary


【解决方案1】:

您不应该为此使用 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+,那很好,您可以忽略警告。

【讨论】:

  • 我明白了。不过有几个问题:
  • 这需要我为每个偏好设置一个监听器,对吗?我在整个程序中有很多偏好,这就是我使用 sharedPreferences 的原因。另外,我认为您正在使用的 findPreference("Preference_key") 是已弃用的。 ;)
  • ((String)newValue) - 这个转换是多余的。
【解决方案2】:

我一直在尝试在我的代码中使用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);
        }
    }
}

【讨论】:

  • bjnord,这正是我遇到的问题,我相信您的答案是正确的方法,但是要启用该侦听器,示例代码告诉您在 onResume() 和 onPause() 中注册getPreferenceScreen().getSharedPreferences() .registerOnSharedPreferenceChangeListener(this);但是这段代码崩溃了,因为最后一个方法给了我 NullPointerException。您是否使用其他方式来启用侦听器?谢谢
  • 给我 NullPointerException 只适用于 Android 3.0+,对于 Api
猜你喜欢
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2019-09-01
  • 2012-06-09
  • 2014-08-20
相关资源
最近更新 更多