0

I have some CheckBoxPreference elements for which I would like to use one onClickListener for all the CheckBoxPreference in my page. Here is what I'm trying to do:

    CheckBoxPreference checkboxPref = (CheckBoxPreference)getPreferenceManager().findPreference("preference1");
    CheckBoxPreference checkboxPref1 = (CheckBoxPreference)getPreferenceManager().findPreference("preference2");
    checkboxPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
        @Override
        public boolean onPreferenceClick(Preference preference) {
            CheckBoxPreference pref = (CheckBoxPreference) findPreference("preference1");

            if (pref.isChecked())
            {
                pref.setChecked(false);
                dialog.show();
            }else if (!pref.isChecked())
            {
                pref.setChecked(true);
                dialog.show();
            }
            return false;
        }
    });
}

How can i make this onPreferenceClick() be executed for the checkboxPref1? Any ideas? Thanks!

3 Answers3

1
OnePreferenceClickListener listener = new Preference.OnPreferenceClickListener() {
    @Override
    public boolean onPreferenceClick(Preference preference) {
        CheckBoxPreference pref = (CheckBoxPreference) findPreference("preference1");
            pref.setChecked(!pref.isChecked());
            dialog.show();
        return false;
    }
});
checkboxPref.setOnPreferenceClickListener(listener);
checkboxPref1.setOnPreferenceClickListener(listener);

Alternatively you can have your class implement the interface and then just pass this to both checkbox preferences.

Hemanth
  • 2,717
  • 2
  • 21
  • 29
Ben
  • 1,285
  • 1
  • 9
  • 15
  • Thanks a lot your comment was very helpful. I would like to ask you though how can I add a String parameter in my onPreferenceClick function? If i try to write: onPreferenceClick(Preference preference, String string) I get an error as well if I try to add it in the Preference.OnPreferenceClickListener(String string). –  Feb 26 '15 at 09:19
  • You can't change the method signature because it won't match the OnPreferenceClickListener interface. You can access a String inside the function if it's either a class variable or a final variable. – Ben Feb 26 '15 at 13:23
  • Depends on how you want to do it. If those are strings you're setting in the code you can make peferenceOneName a class variable. Or if you're reading them from resources you could just have a final variable preferenceOneName and then assign it the value of the resource string. – Ben Feb 26 '15 at 13:43
  • By doing in the onPreferenceClick the following i can make the on click listener work for every checkboxpreference: final CheckBoxPreference pref = (CheckBoxPreference)preference; My problem is now that in the creation of the dialog i have a check that is supposed to use that preference. Is there anyway to make that work for every preference as well? –  Feb 26 '15 at 13:49
  • Here is the check: builder.setPositiveButton(R.string.set, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { final CheckBoxPreference pref = (CheckBoxPreference) findPreference("preference1") if(pref.isChecked()) { pref.setChecked(false); }else if (!pref.isChecked()) { pref.setChecked(true); } } }); –  Feb 26 '15 at 13:58
  • ok i figured it out:(1) I made a global variable private static CheckBoxPreference curPreference; (2) inside my onPreferenceClick i added: CheckBoxPreference pref = (CheckBoxPreference) preference;//findPreference("pref_profile_cat_alerts"); curPreference=pref; (3) changed the pref.isChecked() with curPreference.isChecked() –  Feb 26 '15 at 15:19
0

To add onto Bens Answer, it is best practice to create the Listener as private final (or public final if it needs to be accessed elsewhere) since it will not change:

 private final OnePreferenceClickListener listener = new Preference.OnPreferenceClickListener() {
    @Override
    public boolean onPreferenceClick(Preference preference) {
        CheckBoxPreference pref = (CheckBoxPreference) findPreference("preference1");

        if (pref.isChecked()) {
           pref.setChecked(false);
           dialog.show();
        }else if (!pref.isChecked()){
            pref.setChecked(true);
            dialog.show();
        }
        return false;
   }
});

If the Class itself is pretty simple then you can add implements Preference.OnPreferenceClickListener to your class which will force you to add Override:

    @Override
    public boolean onPreferenceClick(Preference preference) {
        CheckBoxPreference pref = (CheckBoxPreference) findPreference("preference1");

        if (pref.isChecked()) {
           pref.setChecked(false);
           dialog.show();
        }else if (!pref.isChecked()){
            pref.setChecked(true);
            dialog.show();
        }
        return false;
   }
kandroidj
  • 13,784
  • 5
  • 64
  • 76
-1
        @Override
        public boolean onPreferenceClick(Preference preference) {
            // TODO Auto-generated method stub
            CheckBoxPreference pref = (CheckBoxPreference) findPreference("preference1");
            if (pref.isChecked())
            {
                pref.setChecked(true);
            }else if (!pref.isChecked())
            {
                pref.setChecked(false);
            }
            return pref.isChecked();
        }
Gà Và Sói
  • 61
  • 1
  • 4