2013-08-24 12 views
8

私のアプリケーションの設定ページを作成していますSwitchPreferenceとCheckBoxPreference in code

API-14の後にswitchpreferenceが利用できます。そして、私はAPI14 +デバイス

にcheckboxpreferenceを置き換えるためにそれを使用したいと思いますしかし、符号化部では、それは切り替えに非常に便利ではない、正しいXMLリソース

を取得するためにres/xmlres/xml-14を使用して容易です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); 
    } 
    ... 
} 

今、私の方法は、Build.VERSIONをチェックし、それを処理するために、対応するオブジェクトを取得する場合、句を使用することです。 しかし、コードを管理するのは非常に不便で、難しいです。 誰かがそれを行うよりスマートな方法がありますか?

答えて

12

たぶん、あなたはこのように、あなたの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 
    } 
    ... 
} 

これはあなたのために働くことを願っています。その後、何かのようなことが可能になる

enable = (Preference)findPreference(key_enable); 

+1

ありがとう:

これは、あなたが提供するコードサンプルがどのように見えるかです。 –

1

コードが優先インスタンスとしたいと思う内容に応じて、その代わりに、特定の派生型、例えばのPreferenceにキャストするのと同じくらい簡単かもしれません。

enable.setEnabled(true); 

となり、コード内のAPIレベルを確認する必要がなくなります。

6

Javaコードでは、CheckBoxPreferenceSwitchPreferenceの両方の親クラスであるTwoStatePreferenceを使用してください。あなたのユースケースで必要と思われるすべてのメソッドがあります。

public class SettingActivity extends PreferenceActivity { 
    private TwoStatePreference enable; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     addPreferencesFromResource(R.xml.setting); 
     enable = (TwoStatePreference) findPreference(key_enable); 
    } 
    ... 
} 
+0

しかし、TwoStatePreferenceはAPIレベル14で追加されているため、CheckBoxPreferenceが必要な場合には使用できません – BeniBela