アプリの設定ページを作成しています
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
をチェックし、対応するオブジェクトを取得して処理することです。しかし、コードを管理するのは非常に不便で困難です。誰かがそれを行うためのより賢い方法を持っていますか?
次のように、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
}
...
}
これがあなたのために働くことを願っています。
Javaコードでは TwoStatePreference
を使用します。これは、CheckBoxPreference
とSwitchPreference
の両方の親クラスです。ユースケースで必要になる可能性のあるすべてのメソッドがあります。
提供したコードサンプルは次のようになります。
public class SettingActivity extends PreferenceActivity {
private TwoStatePreference enable;
@Override
protected void onCreate(Bundle savedInstanceState) {
addPreferencesFromResource(R.xml.setting);
enable = (TwoStatePreference) findPreference(key_enable);
}
...
}
コードが設定インスタンスで何をしたいかによっては、特定の派生型の代わりにPreference
にキャストするのと同じくらい簡単な場合があります。例:
enable = (Preference)findPreference(key_enable);
これにより、次のようなことが可能になります。
enable.setEnabled(true);
コード内のAPIレベルをチェックする必要がなくなります。