如何在Android上以编程方式打开SwitchPreference

时间:2018-11-30 02:11:29

标签: android sharedpreferences android-preferences preferenceactivity android-settings

我有一个设置片段,可以使用默认设置页面加载xml,我还为一个特定的首选项添加了一个单击侦听器

   @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.settings);
       preferences.findPreference(getString(R.string.pref_custom_list)).setOnPreferenceChangeListener(this);
//other stuff.....

这很好用,当用户单击触发事件时,我可以检查有关开关的一些信息,包括拒绝更改...

但是我想在同一屏幕上打开/关闭其他开关

我试图

   preferences.findPreference(getString(R.string.xpto)).setEnabled(true);

但是它不会打开或关闭任何开关...它只是将视图设置为启用或禁用点击

如果我做类似的事情 PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("xpto",true).apply();

它的确更改了首选项,但更改未加载到屏幕上,因此用户不知道

我如何以编程方式打开或关闭某些首选项,并使其反映到首选项屏幕

3 个答案:

答案 0 :(得分:3)

您可以使用SwitchPreferenceCompat

<SwitchPreferenceCompat
    app:key="key"
    app:title="Some Confs" />

如果您如上所述使用SwitchPreferenceCompat,请在片段中尝试一下。

SwitchPreferenceCompat switchPref = findPreference("key");
switchPref.setChecked(true);

答案 1 :(得分:1)

您要查找的是setChecked(),而不是setEnabled()

preferences.findPreference(getString(R.string.xpto)).setChecked(true);

答案 2 :(得分:0)

我认为您需要在SharedPreferences更改时实现一个侦听器。

SharedPreferences.OnSharedPreferenceChangeListener spChanged = new
                       SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {
    // change the Switch Preference state here
    }
};

然后,当首选项更改时,您可以更改用户的屏幕以使其匹配。

供您参考:

How to detect if changes were made in the preferences?