Cómo crear un grupo RadioButton en la ventana preference.xml?

Soy principiante en Java Android en desarrollo. Estoy usando la versión Eclipse SDK 3.6.1. Tengo una ventana de las preferencias con dos casilla de verificación y un botón de la parte posterior.

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="PIN requirement"> <CheckBoxPreference android:title="Use PIN" android:defaultValue="true" android:key="checkboxPref" /> <CheckBoxPreference android:title="Don't use PIN" android:defaultValue="false" android:key="checkboxPref2" /> </PreferenceCategory> <PreferenceCategory> <Preference android:title="Back" android:key="customPref" /> </PreferenceCategory> </PreferenceScreen> 

Cómo cambiar dos CheckBox en el grupo RadioButton?

Si sólo necesita habilitar o deshabilitar el PIN, solo una CheckBoxPreference será suficiente en este caso (vea el siguiente código de ejemplo, Primera categoría). Los RadioButtons suelen usarse, cuando necesitas elegir algo de una lista de ajustes (ListPreference) – por ejemplo (ver código de ejemplo, Segunda categoría), para elegir un color.

 <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="First Category"> <CheckBoxPreference android:title="Using PIN" android:defaultValue="false" android:key="checkboxPref" android:summaryOn="Disable PIN" android:summaryOff="Enable PIN"/> </PreferenceCategory> <PreferenceCategory android:title="Second Category"> <ListPreference android:title="Pick your favourite color" android:key="listPref" android:defaultValue="4" android:entries="@array/listArray" android:entryValues="@array/listValues" /> </PreferenceCategory> </PreferenceScreen> 

El código fuente de este ejemplo será:

 public class PreferencesHelpExample extends PreferenceActivity implements OnSharedPreferenceChangeListener { public static final String KEY_LIST_PREFERENCE = "listPref"; private ListPreference mListPreference; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); // Get a reference to the preferences mListPreference = (ListPreference)getPreferenceScreen().findPreference(KEY_LIST_PREFERENCE); } @Override protected void onResume() { super.onResume(); // Setup the initial values mListPreference.setSummary("Current value is " + mListPreference.getEntry().toString()); // Set up a listener whenever a key changes getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override protected void onPause() { super.onPause(); // Unregister the listener whenever a key changes getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); } public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { // Set new summary, when a preference value changes if (key.equals(KEY_LIST_PREFERENCE)) { mListPreference.setSummary("Current value is " + mListPreference.getEntry().toString()); } } } 

Para ListPreference también necesitará un archivo arrays.xml, que se encuentra en la carpeta "values":

 <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="listArray"> <item>red</item> <item>orange</item> <item>yellow</item> <item>green</item> <item>blue</item> <item>violet</item> </string-array> <string-array name="listValues"> <item>1</item> <item>2</item> <item>3</item> <item>4</item> <item>5</item> <item>6</item> </string-array> </resources> 

Vea también algunos buenos ejemplos, trabajando con PreferenceActivity – me ayudaron mucho:

Preferencias de Android;
Cómo crear un grupo de RadioButtons en lugar de una lista;
¿Cómo mostrar el valor actual de una preferencia de Android en el resumen de preferencias?

En algunas situaciones, tener Preferencias se comportan como botones de radio es una característica agradable por ejemplo una manera simple de incluir el texto de resumen bajo cada opción.

Hacer que un grupo de casillas de verificación se comporte como un grupo de botones de radio es bastante simple. Para hacer esto en Preferencias, registre todas las casillas de verificación en el grupo en el mismo OnPreferenceChangeListener entonces en este oyente use findPreference () para encontrar las otras casillas de verificación y llame a setChecked (false);

 public boolean onPreferenceChange(Preference preference, Object newValue) { String key = preference.getKey(); if (key.equals("checkboxPref")) { //Reset other items CheckBoxPreference p = (CheckBoxPreference)findPreference("checkboxPref2"); p.setChecked(false); } else if (key.equals("checkboxPref2")) { //Reset other items CheckBoxPreference p = (CheckBoxPreference)findPreference("checkboxPref"); p.setChecked(false); } //Force the current focused checkbox to always stay checked when pressed //ie confirms value when newValue is checked (true) and discards newValue //when newValue is unchecked (false) return (Boolean)newValue; } 

El único inconveniente es que las casillas de verificación no se verán como botones de radio …

Creo que esto es bastante simple si eso es lo que quieres:

  1. Añada las casillas de verificación en el xml preferenses como ese:

      <CheckBoxPreference android:key="prefkey_cbp_1" android:summary="@string/prefkey_cbp_1" android:title="@string/prefkey_cbp_1" android:defaultValue="false" /> <CheckBoxPreference android:key="prefkey_cbp_2" android:summary="@string/prefkey_cbp_2" android:title="@string/prefkey_cbp_2" android:defaultValue="false" /> //etc... 
  2. En la clase de preferencias onCreate, construye una matriz o lista CheckBoxPreference o lo que quieras, así:

     ArrayList<CheckBoxPreference> cbp_list = new ArrayList<CheckBoxPreference>(); cbp_list.add((CheckBoxPreference) getPreferenceManager() .findPreference(PreferencesProtocol.prefkey_cbp_1)); cbp_list.add((CheckBoxPreference) getPreferenceManager() .findPreference(PreferencesProtocol.prefkey_cbp_2)); 
  3. Haga que su clase de preferencias implemente OnPreferenceClickListener y establezca OnPreferenceClickListener en las casillas de verificación como:

     for (CheckBoxPreference cbp : cbp_list) { cbp.setOnPreferenceClickListener(this); } 
  4. A continuación, solo anule el onPreferenceClick y maneje cualquier clic. Por ejemplo, si desea que las casillas de verificación funcionen como botones de radio (en el mismo radiogrupo), es decir, sólo una casilla de verificación en el momento de la comprobación, haga algo así:

     @Override public boolean onPreferenceClick(Preference arg0) { for (CheckBoxPreference cbp : cbp_list) { if (!cbp.getKey().equals(arg0.getKey()) && cbp.isChecked()) { cbp.setChecked(false); } } return false; } 

prueba esto:

  @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, @NonNull Preference preference) { CheckBoxPreference cb1 = null; CheckBoxPreference cb2 = null; ListAdapter adapter = preferenceScreen.getRootAdapter(); for(int i = 0; i < preferenceScreen.getRootAdapter().getCount(); i++) { //attention to type and key Preference pref = (Preference) adapter.getItem(i); if (pref == null || pref.getKey() == null) continue; if (pref.getKey().equals(getString(R.string.tag_preference_key_always_zoom_to_akt_position))) cb1 = (CheckBoxPreference) pref; if (pref.getKey().equals(getString(R.string.tag_preference_key_always_zoom_to_last_location))) cb2 = (CheckBoxPreference) pref; if (cb1 != null && cb2 != null) break; } //be safe if (cb1 == null || cb2 == null) return super.onPreferenceTreeClick(preferenceScreen, preference); if (preference.getKey().equals(getString(R.string.tag_preference_key_always_zoom_to_akt_position))) { CheckBoxPreference cb = (CheckBoxPreference) preference; cb2.setChecked(!cb.isChecked()); } if (preference.getKey().equals(getString(R.string.tag_preference_key_always_zoom_to_last_location))) { CheckBoxPreference cb = (CheckBoxPreference) preference; cb1.setChecked(!cb.isChecked()); } return super.onPreferenceTreeClick(preferenceScreen, preference); } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.