web-dev-qa-db-fra.com

Comment créer un groupe de boutons radio dans la fenêtre de préférence.xml?

Je suis débutant dans Java Android Développement. J'utilise la version Eclipse SDK 3.6.1. J'ai une fenêtre de préférences avec deux cases à cocher et un bouton de retour .

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

Comment modifier deux cases dans le groupe Radiobutton?

18
Juronis

Si vous avez besoin d'activer ou de désactiver ou de désactiver à l'aide de la goupille, une seule case à cocher sera suffisante dans ce cas (voir exemple code ci-dessous, première catégorie). Les radiobuttons sont généralement utilisés, lorsque vous devez choisir quelque chose dans une liste de paramètres (listpreference) - par exemple (voir exemple code, deuxième catégorie), pour choisir une couleur.

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

Le code source de cet exemple sera:

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()); 
        }
    }
}

Pour ListPreference, vous aurez également besoin d'un fichier Arrays.xml, situé dans le dossier "Valeurs":

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

Voir aussi quelques excellents exemples, en travaillant avec la préférence - ils m'ont beaucoup aidé:

Préférences Android;
[.____] Comment créer un groupe de radiobuttons au lieu d'une liste;
[.____] Comment afficher la valeur actuelle d'un Android préférence dans le résumé de la préférence?

34
Kate

Dans certaines situations, avoir des préférences se comporter comme des boutons radio est une fonctionnalité intéressante, un moyen simple d'inclure le texte récapitulatif sous chaque option.

Faire un groupe de cases à cocher se comporter comme un groupe de boutons radio est assez simple. Pour ce faire dans les préférences, enregistrez toutes les cases à cocher du groupe sur le même onperrencechanGangelistener, puis dans cet écouteur Utilisez FindPreference () pour rechercher les autres cases à cocher et appeler SetChecked (Faux);

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

Le seul inconvénient est que les cases à cocher ne ressembleront pas à des boutons radio ...

11
Hamiora

essaye ça:

    @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);
    }
0
tom nobleman