【问题标题】:Android - Preferences API onSharedPreferenceChanged - Which way is correct?Android - Preferences API onSharedPreferenceChanged - 哪种方式是正确的?
【发布时间】:2026-01-13 15:45:01
【问题描述】:

我正在使用Preferences-API 在我的应用程序中实施设置。
我选择使用PreferenceFragment

我的PreferenceFragment 包含我的onSharedPreferenceChanged 代码。
但是,对于我的Preferences 之一,我不确定要通过哪种方式来实现我的目标。
目标是:根据 TogglePreference,启用或禁用我的 Receiver。

下面,我列出了我认为的 2 种不同的方法。
我对这两个示例的推理是 #1 不使用 findPreference(key) 而 #2 使用。
所以我请求反馈 - 哪种方式是正确的?


public static final String PREF_GPS_STATE_LISTENER = "pref_gpsStateListener";

private SharedPreferences.OnSharedPreferenceChangeListener prefChangeListener;
...
...

prefChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    @Override
    public void onSharedPreferenceChanged
        (SharedPreferences sharedPreferences, String key) {

if (key.equals(PREF_GPS_STATE_LISTENER)) {

    final PackageManager pacMan = 
        getActivity().getApplicationContext().getPackageManager();
    final ComponentName compLocationReceiver = new ComponentName
        ("com.studio2bdesigns.testapp021019", ".LocationReceiver");
    final SharedPreferences getPrefs = 
        PreferenceManager.getDefaultSharedPreferences(getActivity());

    if (getPrefs.getBoolean(PREF_GPS_STATE_LISTENER, true)) {

        //  ENABLE THE RECEIVER
        pacMan.setComponentEnabledSetting(compLocationReceiver, 
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

    } else if (!getPrefs.getBoolean(PREF_GPS_STATE_LISTENER, true)) {

        //  DISABLE THE RECEIVER
        pacMan.setComponentEnabledSetting(compLocationReceiver, 
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

    }
}
}

(OR) 这是正确的做法吗:


private SharedPreferences.OnSharedPreferenceChangeListener prefChangeListener;
...
...

prefChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    @Override
    public void onSharedPreferenceChanged
        (SharedPreferences sharedPreferences, String key) {

if (key.equals(PREF_GPS_STATE_LISTENER)) {

    Preference gpsStateListenerPref = findPreference(key);

    final PackageManager pacMan = 
        getActivity().getApplicationContext().getPackageManager();
    final ComponentName compLocationReceiver = new ComponentName
        ("com.studio2bdesigns.testapp021019", ".LocationReceiver");

    if (gpsStateListenerPref.isEnabled()) {

        //  ENABLE THE RECEIVER
        pacMan.setComponentEnabledSetting(compLocationReceiver, 
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

    } else if (!gpsStateListenerPref.isEnabled()) {

        //  DISABLE THE RECEIVER
        pacMan.setComponentEnabledSetting(compLocationReceiver, 
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

    }
}
}

起初我认为选项 #1 是正确的 - 但我想出选项 #2 的原因是因为第一个示例 没有 em> 使用findPreference(key); - 这就是在onSharedPreferenceChanged 中传递key 的全部意义,不是吗?

非常感谢对此的反馈!谢谢!

【问题讨论】:

    标签: android sharedpreferences android-preferences


    【解决方案1】:

    该键用于将视觉控制与共享偏好相匹配。这确实是一个偏好问题。我更喜欢使用数字 1,因为我不依赖于一种观点,并将共同的偏好作为事实的来源。

    【讨论】:

    • 感谢您的意见!我最初在if(key.equals... 内部所做的只是调用它自己的方法public void gpsSettingChanged() 并在其中执行与示例#1 相同的操作。但不确定这是否是一个好方法关于它,或者我是否应该将所有代码留在if(key.equals... 括号内。对此有什么想法吗?还有其他人对我最初的问题有意见吗?
    • 我建议将代码分解成一个方法。
    • 感谢您的意见,非常感谢!我实际上还有另一个相关的问题,如果你不介意给我你的想法吗?所以,在我的public class SettingsFragment extends PreferenceFragment 中,在我的onCreate 方法之前,我列出了我的偏好Strings..(例如:public static final String PREF_GPS_STATE_LISTENER = "pref_gpsStateListener";)..我的问题是,当我需要引用和检索我的偏好值时在一个不同的类中,我应该在每个类中做同样的事情吗,OR,我应该引用像SettingsFragment.PREF_GPS_STATE_LISTENER..?
    • 我会创建一个名为Prefs 的类并将密钥放在那里。这样您就不会在代码的其他部分引用片段。
    • @Studio2bDesigns 如果您喜欢这个答案,请接受。