Как создать группу RadioButton в окне preference.xml?

Я новичок в разработке Java Android. Я использую версию Eclipse SDK 3.6.1. У меня есть окно настроек с двумя флажками и одной кнопкой возврата.

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

Как изменить два флажка в группе RadioButton?


person Juronis    schedule 11.02.2011    source источник


Ответы (4)


Если вам нужно просто включить или отключить использование PIN-кода, в этом случае будет достаточно только одного CheckBoxPreference (см. Пример кода ниже, Первая категория). RadioButton обычно используются, когда вам нужно выбрать что-то из списка настроек (ListPreference) - например (см. Пример кода, Вторая категория), чтобы выбрать цвет.

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

Исходный код для этого примера будет:

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

Для ListPreference вам также понадобится файл array.xml, который находится в папке "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>

См. Также отличные примеры работы с PreferenceActivity - они мне очень помогли:

Настройки Android;
Как создать группу RadioButton вместо списка;
Как отобразить текущее значение предпочтения Android в сводке настроек?

person Kate    schedule 16.02.2011
comment
Не могли бы вы объяснить, как в этом случае работает значение по умолчанию в предпочтении списка? - person ben_joseph; 07.09.2015
comment
Извините моя ошибка. Здесь необходимо указать значение - нужно выбрать одно из значений listValues ​​(entryValues). В случае зеленого цвета по умолчанию это будет android: defaultValue = 4 вместо digiGreen. Поправил, спасибо за замечание. - person Kate; 08.09.2015
comment
Это не ответило на вопрос, как сделать группу переключателей. - person Eddie Sullivan; 19.01.2016
comment
Правда, было описано, как сделать ListPreference (определенный во второй категории предпочтений в .xml файле), который содержит диалог со списком RadioButton (определен в array.xml). Если вам не нужны RadioButton, которые объединены в список, см. Это руководство: developer.android.com/guide/topics/ui/controls/radiobutton.html - person Kate; 11.02.2016
comment
На самом деле не отвечает на вопрос, как создать группу RadioButton в окне preference.xml? Кроме того, это первый результат, когда вы Google Android Radio Preference - person Vilius 1989; 08.03.2019

В некоторых ситуациях использование настроек в качестве переключателей является хорошей функцией, например, простой способ включения итогового текста под каждым параметром.

Сделать группу флажков похожей на группу переключателей довольно просто. Для этого в настройках зарегистрируйте все флажки в группе в одном и том же OnPreferenceChangeListener, затем в этом прослушивателе используйте findPreference (), чтобы найти другие флажки, и вызовите 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;
}

Единственным недостатком является то, что флажки не будут похожи на переключатели ...

person Hamiora    schedule 05.06.2012
comment
findPreference () устарел, если вызывается из PrefsActivity, но нормально при вызове из PrefsFragment stackoverflow.com/a/29578281/2162226. Этот ответ направил меня на верный путь - спасибо! - person Gene Bo; 07.05.2015

Я думаю, что это довольно просто, если вы этого хотите:

  1. Добавьте флажки в предпочтительном xml следующим образом:

     <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. В классе настроек onCreate создайте массив или список CheckBoxPreference или что угодно, например:

    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. Сделайте свой класс предпочтений реализуемым OnPreferenceClickListener и установите OnPreferenceClickListener для таких флажков:

    for (CheckBoxPreference cbp : cbp_list) {
    cbp.setOnPreferenceClickListener(this);
    }
    
  4. Затем просто переопределите onPreferenceClick и обработайте любой щелчок. Например, если вы хотите, чтобы флажки работали как радиокнопки (в той же радиогруппе), что означает, что одновременно нужно проверять только один флажок, сделайте что-то вроде этого:

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

попробуй это:

    @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);
    }
person tom nobleman    schedule 14.07.2015