Android v14 SwitchPreference没有更改值

时间:2017-03-14 02:03:12

标签: android switchpreference

班级档案

import android.support.v14.preference.SwitchPreference;
    //...

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    addPreferencesFromResource(R.xml.pref_blank);
    this.preferenceScreen = getPreferenceScreen();
}

   public void resetDevices(ArrayList<DeviceAdapterItem> items) {
        preferenceScreen.removeAll();
        preferenceScreen.setPersistent(false);

        for(DeviceAdapterItem i : items) {

            ExpandablePreferenceCategory category = buildCategory(i);
            preferenceScreen.addPreference(category);

            Preference deviceTypePreference = buildDeviceTypePreference(i);
            deviceTypePreference.setOnPreferenceChangeListener(this);
            category.addPreference(deviceTypePreference);

            Preference monitoring = buildMonitoringPreference(i);
            monitoring.setOnPreferenceChangeListener(this);
            category.addPreference(monitoring);

            Preference wifiOnly = buildWifiOnlyPreference(i);
            wifiOnly.setOnPreferenceChangeListener(this);
            category.addPreference(wifiOnly);

            Preference delete = buildDeletePreference(i);
            delete.setOnPreferenceChangeListener(this);
            category.addPreference(delete);

            category.handleCollapseExpand();
        }
    }

    private Preference buildMonitoringPreference(DeviceAdapterItem i) {
        SwitchPreference monitoring = new SwitchPreference(context.getSupportActionBar().getThemedContext());
        monitoring.setPersistent(false);
        monitoring.setTitle(getString(R.string.monitoring));
        monitoring.setKey("some bogus value" + i.getDeviceId());

        monitoring.setChecked(i.isTakeSnapshots());
        monitoring.setSummary(getString(i.isTakeSnapshots() ? R.string.enabled : R.string.disabled ));
        return monitoring;
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        Log.d("pchange", preference.getTitle() + " = " + newValue.toString());
        if(preference instanceof SwitchPreference) {
            Log.d("pchange", "its a switch!");
            ((SwitchPreference) preference).setChecked((boolean)newValue);
        }
        return true;
    }

pref_blank.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:persistent="false"
    >

</PreferenceScreen>

开关显示关闭(应该打开时)。当我点击UI中的开关时,会触发onPreferenceChange并且newValue会切换。用户界面永远不会改变,它总是处于关闭状态?

2 个答案:

答案 0 :(得分:0)

这是因为您android:persistent设置为false。将其设置为true,UI应相应更改。

答案 1 :(得分:0)

如果您使用

implementation 'com.android.support:preference-v7:27.1.1'

你应该使用 SwitchPreferenceCompat 就像这样

<SwitchPreferenceCompat
            android:key="taskSendNotification"
            android:title="@string/notificationTask"
            android:defaultValue="true"></SwitchPreferenceCompat>

android.support.v14.preference.SwitchPreference不适用于'com.android.support:preference-v7:27.1.1'