【问题标题】:Android v14 SwitchPreference not changing valuesAndroid v14 SwitchPreference 不改变值
【发布时间】:2017-03-14 02:03:12
【问题描述】:

类文件

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 会切换。用户界面永远不会改变,它总是卡在关闭状态?

【问题讨论】:

    标签: android switchpreference


    【解决方案1】:

    如果你使用

    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'

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • Setpersistence 应该只影响保存到本地文件的值。我自己设置值,从后端加载它们。还是出于某种奇怪的原因在 v14 中存在依赖关系?
      • @CamHart 我的理解是,如果首选项的 android:persistent 设置为 true,UI 只会更新其首选项。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多