Preference Activity on Preference Click Listener

android, onclicklistener, preferenceactivity

Solution

I came up with my own (what I believe is really messed up) solution; but it works.

for(int x = 0; x < getPreferenceScreen().getPreferenceCount(); x++){
        PreferenceCategory lol = (PreferenceCategory) getPreferenceScreen().getPreference(x);
        for(int y = 0; y < lol.getPreferenceCount(); y++){
            Preference pref = lol.getPreference(y);
            pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener(){

                @Override
                public boolean onPreferenceClick(Preference preference) {
                    return false;
                }

            });
        }
    }

So what I have learned is there is a hierarchical system that works like: PreferenceScreen has children PreferenceCategory has children Preference, as you can see in the XML file. My problem was I could not set the preferences' onClickListeners directly from the PreferenceScreen. So I made two for loops that will get down to each Preference and set an OnPreferenceClickListener for each and every one of them. Messy, but works finally.

Problem

I am building a Preference Activity where most of the preferences in the list will be executing code and not modifying a SharedPreference directly. My preferences.xml file looks like this. ``` <PreferenceCategory android:title="Connection" > <Preference android:id="@+id/settings_connectToNewComputer" android:key="connectToNewComputer" android:summary="Currently connected to:" android:title="Connect to new computer" /> <Preference android:id="@+id/removeDevice" android:key="removeDevice" android:summary="Remove this device from the computer's whitelist" android:title="Remove this device from computer" /> </PreferenceCategory> <PreferenceCategory android:title="About" > <Preference android:id="@+id/settings_About" android:key="about" android:summary="About me and my thanks to those who made this app great" android:title="About Hue Pro" /> <Preference android:id="@+id/contact" android:key="contact" android:summary="Contact me with comments, bugs, and suggestions for updates" android:title="Contact me" /> </PreferenceCategory> ``` My goal is to have a block of code executed when a one of these preferences are clicked. Similar to the "Clear search history" in the Google Play settings preference menu. (https://i.stack.imgur.com/HgEE4.png) Does anyone know how to make this possible? I have to add that I have tried using findPreference("KeyNameHere") but it always returns null. Thank you! Edit: I added in this code and implemented OnPreferenceClickListener: ``` @Override public boolean onPreferenceClick(Preference preference) { return false; } ``` But this method never gets called. Is there another way to do this? Edit 2: I have found that if I take out the PreferenceCategory tags so I am left with this: ``` <Preference android:id="@+id/settings_connectToNewComputer" android:key="connectToNewComputer" android:summary="Currently connected to:" android:title="Connect to new computer" /> <Preference android:id="@+id/removeDevice" android:key="removeDevice" android:summary="Remove this device from the computer's whitelist" android:title="Remove this device from computer" /> <Preference android:id="@+id/settings_About" android:key="about" android:summary="About me and my thanks to those who made this app great" android:title="About Hue Pro" /> <Preference android:id="@+id/contact" android:key="contact" android:summary="Contact me with comments, bugs, and suggestions for updates" android:title="Contact me" /> ``` and call this: ``` getPreferenceScreen().setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { return false; } }); ``` then I actually get a response from the click event. The only down side is I have to remove the preference grouping. Anyone know why this is and any way to fix it?

Original source