2013-08-24 19 views
8

Sto creando una pagina di preferenze per la mia appSwitchPreference e CheckBoxPreference nel codice

Dopo API-14, switchpreference è disponibile. e vorrei usarlo per sostituire checkboxpreference su API14 + dispositivi

E 'facile da usare res/xml e res/xml-14 per ottenere la risorsa xml corretta

Tuttavia, nella parte di codifica, non è così conveniente per il passaggio alla preferenza secondo l'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); 
    } 
    ... 
} 

Ora il mio modo è quello di utilizzare in caso di clausola di verificare la Build.VERSION e ottenere l'oggetto corrispondente per elaborarlo. Ma è abbastanza scomodo e difficile da gestire il codice. Qualcuno ha un modo più intelligente per farlo?

risposta

12

Forse si potrebbe impostare un attributo android:key sia della vostra SwitchPreference e CheckBoxPreference xml, proprio come questo:

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

e

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

E poi si può controllare se questo tasto riporta vero o falso sul tuo codice, qualcosa del genere:

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

Spero che questo funzioni per te.

+1

Grazie. Funzionava perfettamente –

1

A seconda di quello che il codice vorrebbe fare con l'istanza preferenza, potrebbe essere semplice come la fusione di Preference invece di uno specifico tipo derivato, ad esempio:

enable = (Preference)findPreference(key_enable); 

che sarebbe poi permettere una cosa del genere:

enable.setEnabled(true); 

ed eliminare la necessità di controllare il livello API nel codice.

6

Nel codice Java utilizzare TwoStatePreference, che è una classe genitore per entrambi CheckBoxPreference e SwitchPreference. Ha tutti i metodi che probabilmente ti serviranno nel tuo caso d'uso.

Questo è ciò che il codice di esempio che hai fornito sarà simile:

public class SettingActivity extends PreferenceActivity { 
    private TwoStatePreference enable; 

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

Ma TwoStatePreference è stato aggiunto al livello API 14, quindi non è possibile utilizzarlo nei casi in cui è necessario il CheckBoxPreference – BeniBela

Problemi correlati