Как создать группу RadioButton в окне preference.xml? - PullRequest
18 голосов
/ 11 февраля 2011

Я новичок в разработке 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>

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

Ответы [ 4 ]

32 голосов
/ 16 февраля 2011

Если вам нужно просто включить или отключить использование PIN-кода, в этом случае будет достаточно только одной CheckBoxPreference (см. Пример кода ниже, первая категория). Радиокнопки обычно используются, когда вам нужно выбрать что-то из списка настроек (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 вам также понадобится файл arrays.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;
Как создать группу радиокнопок вместо списка;
Как отобразить текущее значение предпочтения Android в сводке настроек?

11 голосов
/ 05 июня 2012

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

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

Единственный недостаток -что флажки не будут выглядеть как переключатели ...

3 голосов
/ 30 мая 2014

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

  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;
    }
    
0 голосов
/ 14 июля 2015

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

    @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);
    }
...