rsiljat
rsiljat

Reputation: 13

Android: CheckboxPreferences act like RadioButtons

I have four checkboxpreferences in my preferencescreen that I would like to interact like a radiobuttongroup, meaning that you can only check one of them! If lets say the first is checked, and you like to check another one, its just the desired one checked, and the other ones is unchecked.

Upvotes: 1

Views: 2189

Answers (2)

Ray
Ray

Reputation: 31

I did like this :

public class PreferenceActivity extends PreferenceActivity {

    private SharedPreferences  prefs;
    private Editor             editor;
    private int                keyItemChecked;
    private CheckBoxPreference item1CheckBox, item2CheckBox, ..., itemICheckBox;

    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        prefs = PreferenceManager.getDefaultSharedPreferences(this);

        addPreferencesFromResource(R.xml.prefs);

        item1CheckBox = (CheckBoxPreference) getPreferenceManager().findPreference("item1");
        item2CheckBox = (CheckBoxPreference) getPreferenceManager().findPreference("item2");
        ...     
        itemICheckBox = (CheckBoxPreference) getPreferenceManager().findPreference("itemI");

        item1CheckBox.setOnPreferenceClickListener(new OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference arg0) {
                 manageItem(1, item1CheckBox);
                 return true;
            }
        });
        ....
        itemICheckBox.setOnPreferenceClickListener(new OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference arg0) {
                 manageItem(I, itemICheckBox);
                 return true;
            }
        });

    }
    private void manageItem(int i ,CheckBoxPreference pref) {
        keyItemChecked = prefs.getInt("keyItemChecked",1); // 1 is your default checked item
        if (! pref.isChecked() && keyItemChecked == i)
        // If you click on the checked item, you don't want it to be unchecked :
            pref.setChecked(true);
        if (pref.isChecked() && keyItemChecked != i) {
            editor = prefs.edit();
            editor.putInt("keyItemChecked", i);
            editor.commit();  // or editor.apply() if you use API > 9
            unckeckOldItem(keyItemChecked);
        }
    }
    private void unckeckOldItem(int item) {
        switch (item) {
        case 1:
            item1CheckBox.setChecked(false);
            break;
        ...
        case I:
            itemICheckBox.setChecked(false);
            break;
    }
}

You don't need to declare "keyItemChecked" on your prefs.xml. The first time you call the activity, the data doesn't exist and

keyItemChecked = prefs.getInt("keyItemChecked",1);

will return 1. Once you click on an other item than the default, the data will exist.

Upvotes: 3

Falmarri
Falmarri

Reputation: 48577

Looks like you can use http://developer.android.com/reference/android/preference/CheckBoxPreference.html#setDisableDependentsState%28boolean%29 to create that functionality. I think setting dependency of preferences can be done in xml.

Upvotes: 0

Related Questions