2011-02-11 12 views
15

Soy un principiante en el desarrollo de Android con Java. Estoy usando la versión Eclipse SDK 3.6.1. Tengo una ventana de preferencias con dos casillas de verificación y un botón de retroceso.Cómo crear el grupo RadioButton en la ventana preference.xml?

<?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 RadioButton al grupo?

Respuesta

30

Si solo necesita habilitar o deshabilitar el uso del PIN, bastará con una CheckBoxPreference en este caso (consulte el siguiente código de ejemplo, Primera Categoría). Los RadioButton se usan generalmente, cuando necesita elegir algo de una lista de configuraciones (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 para 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 "valores":

<?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 excelentes ejemplos, trabajando con PreferenceActivity - me ayudaron mucho:

Android Preferences;
How to create a group of RadioButtons instead of a list;
How to display the current value of an Android Preference in the Preference summary?

+1

¿Podría explicarnos cómo funciona el valor predeterminado en la preferencia de lista en este caso? – notsopopularguy

+1

lo siento, mi error. El valor debe especificarse aquí; debe elegir uno de los listValues ​​(entryValues). En caso de color verde predeterminado, sería android: defaultValue = "4" en lugar de "digiGreen". Corregido, gracias por el comentario. – Kate

+2

Esto no respondió la pregunta, que era cómo hacer un grupo de botones de opción. –

11

En algunas situaciones, tener preferencias se comportan como botones de radio es una buena característica por ejemplo una forma sencilla de incluir texto del resumen dentro de 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, luego en este oyente use findPreference() para buscar 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 
    //i.e 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á como botones de radio ...

+0

findPreference() está en desuso si se llama desde PrefsActivity , pero está bien cuando se llama desde PrefsFragment http://stackoverflow.com/a/29578281/2162226. Esta respuesta me puso en el camino correcto, ¡gracias! – gnB

3

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

  1. Añadir las casillas de verificación en el preferenses xml así:

    <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 preferencias onCreate construir una matriz CheckBoxPreference o lista o lo que quiera, al igual que:

    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 su clase preferencias implementar OnPreferenceClickListener y establecer el OnPreferenceClickListener a las casillas de verificación por el estilo:

    for (CheckBoxPreference cbp : cbp_list) { 
    cbp.setOnPreferenceClickListener(this); 
    } 
    
  4. A continuación, sólo anular el onPreferenceHaga clic y maneje cualquier clic.Por ejemplo, si desea casillas de verificación para funcionar como botones de radio (en el mismo radiogroup), es decir, sólo una casilla de verificación en el momento de ser cheque, hacer 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; 
    } 
    
0

probar 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); 
    } 
Cuestiones relacionadas