web-dev-qa-db-ja.com

コード内のSwitchPreferenceとCheckBoxPreference

アプリの設定ページを作成しています

API-14以降、switchpreferenceが使用可能になります。 API14 +デバイスのチェックボックス設定を置き換えるために使用したいと思います

res/xmlおよびres/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をチェックし、対応するオブジェクトを取得して処理することです。しかし、コードを管理するのは非常に不便で困難です。誰かがそれを行うためのより賢い方法を持っていますか?

9
Chiman

次のように、SwitchPreferencexmlとCheckBoxPreferencexmlの両方に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
    }
    ...
}

これがあなたのために働くことを願っています。

14
Renan Ferrari

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);
    }
    ...
}
6
AleXqwq

コードが設定インスタンスで何をしたいかによっては、特定の派生型の代わりにPreferenceにキャストするのと同じくらい簡単な場合があります。例:

enable = (Preference)findPreference(key_enable);

これにより、次のようなことが可能になります。

enable.setEnabled(true);

コード内のAPIレベルをチェックする必要がなくなります。

1
Mark Larter