【问题标题】:SwitchPreference and CheckBoxPreference in code代码中的 SwitchPreference 和 CheckBoxPreference
【发布时间】:2013-08-24 02:18:17
【问题描述】:

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

在 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 并获取相应的对象来处理它。 但是管理代码非常不方便和困难。 有人有更聪明的方法吗?

【问题讨论】:

    标签: java android xml android-preferences


    【解决方案1】:

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

    <?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
        }
        ...
    }
    

    希望这对你有用。

    【讨论】:

    • 谢谢。完美运行
    【解决方案2】:

    在您的 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);
        }
        ...
    }
    

    【讨论】:

    • 但是 TwoStatePreference 是在 API 级别 14 中添加的,所以在需要 CheckBoxPreference 的情况下不能使用它
    【解决方案3】:

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

    enable = (Preference)findPreference(key_enable);
    

    这将允许类似:

    enable.setEnabled(true);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 2012-03-17
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      相关资源
      最近更新 更多