9

我现在正在为我的应用创建一个偏好页面

在 API-14 之后,switchpreference 可用。我想用它来替换 API14+ 设备上的 checkboxpreference

它易于使用res/xmlres/xml-14获得正确的xml资源

但是,在编码部分,根据API切换偏好并不那么方便。

public class SettingActivity extends PreferenceActivity {
    private CheckBoxPreference enable;
    private SwitchPreference enablev14;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        addPreferencesFromResource(R.xml.setting);
        if (Build.VERSION.SDK_INT < 14)
            enable = (CheckBoxPreference) findPreference(key_enable);
        else
            enablev14 = (SwitchPreference) findPreference(key_enable);
    }
    ...
}

现在我的方法是使用 if-clause 来检查Build.VERSION并获取相应的对象来处理它。但是管理代码非常不方便和困难。有人有更聪明的方法吗?

4

3 回答 3

14

也许你可以android:key为你的 SwitchPreference 和 CheckBoxPreference xml 设置一个属性,就像这样:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:key="pref_sync"
        android:title="@string/pref_sync"
        android:defaultValue="true" />
</PreferenceScreen>

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <SwitchPreference
        android:key="pref_sync"
        android:title="@string/pref_sync"
        android:defaultValue="true" />
</PreferenceScreen>

然后您可以检查此键在您的代码中返回 true 还是 false,如下所示:

public class SettingActivity extends PreferenceActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    addPreferencesFromResource(R.xml.setting);
    PreferenceManager preferenceManager = getPreferenceManager();
    if (preferenceManager.getSharedPreferences().getBoolean("pref_sync", true)){
        // Your switch is on
    } else {
        // Your switch is off
    }
    ...
}

希望这对你有用。

于 2013-08-24T02:46:20.950 回答
6

在您的 Java 代码中使用,它是和TwoStatePreference的父类。它具有您在用例中可能需要的所有方法。CheckBoxPreferenceSwitchPreference

这就是您提供的代码示例的样子:

public class SettingActivity extends PreferenceActivity {
    private TwoStatePreference enable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        addPreferencesFromResource(R.xml.setting);
        enable = (TwoStatePreference) findPreference(key_enable);
    }
    ...
}
于 2015-04-11T13:32:51.320 回答
1

根据代码想要对首选项实例做什么,它可能就像转换为Preference而不是特定的派生类型一样简单,例如:

enable = (Preference)findPreference(key_enable);

这将允许类似的东西:

enable.setEnabled(true);

并消除了在代码中检查 API 级别的需要。

于 2013-09-04T03:27:48.647 回答