Preference Activity on Preference Click Listener

后端 未结 7 2303
無奈伤痛
無奈伤痛 2020-12-14 18:27

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 l

相关标签:
7条回答
  • 2020-12-14 18:55

    Maybe this could not be useful for OP, but could be useful for someone else. I'd like to write a sort of summary; in general, you can follow mainly three ways: 1) you can find your preference somewhere in your code with

    Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE);
    

    and then you can add a click listener and override its on click method with

    examplePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
        @Override
        public boolean onPreferenceClick(Preference preference) {
            // handle click here
        }
    });
    

    This has to be done for every preference whose clicks you want to listen to 2) You can implement Preference.OnPreferenceClickListener interface in your settings fragment/activity and override onPreferenceClick just once, by using a switch construct or a if-else if-else if-... construct and merging all the single handlings; it should be something like:

    @Override
    public boolean onPreferenceClick(Preference preference) {
        switch (preference.getKey()) {
            case KEY_EXAMPLE_PREFERENCE: {
                // handle click here
            }
            break;
            case ...
        }
    }
    

    Then, you still have to find each preference but you can simply call on each of them

    setOnPreferenceClickListener(this);
    

    (I think the OP's implementation didn't work (his method wasn't called) because of this last part) we pass "this" as parameter because we implemented the click listener interface

    3) (which I think is the easiest) you can override

    onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)
    

    in your preference fragment/activity without implementing any other interface and there you can copy the switch of the if-else if-... construct of option 2); the main advantage in that you shouldn't need to find each preference and to call on them setOnPreferenceClickListener.

    Hope this will be useful for someone!

    0 讨论(0)
  • 2020-12-14 18:59

    Your Preference object wont get null if you will find followings (copypasting from the project):

    public class ImePreferences extends PreferenceActivity {
    

    .....

    @Override
    protected boolean isValidFragment(String fragmentName) {
        return Settings.class.getName().equals(fragmentName);
    }
    

    .....

    public static class Settings extends InputMethodSettingsFragment {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setInputMethodSettingsCategoryTitle(R.string.language_selection_title);
            setSubtypeEnablerTitle(R.string.select_language);
    
            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.ime_preferences);
            Preference pLcl = getPreferenceScreen().findPreference(getResources().getString(
                    R.string.dictionary_button));
            pLcl.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {
                    // handle click here
                    l.a("this is the click");
                    return true;
                }
            });
            if(pLcl != null)
                l.a(6576);
        }
    }
    

    .....

    }
    
    0 讨论(0)
  • 2020-12-14 19:00

    Implement OnPreferenceClickListener and in the onPreferenceClick

    @Override
    public boolean onPreferenceClick (Preference preference)
    {
        String key = preference.getKey();
        // do what ever you want with this key
    }
    
    0 讨论(0)
  • 2020-12-14 19:09

    Just override:

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
    
        String key = preference.getKey();
        ...
    
        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }
    
    0 讨论(0)
  • 2020-12-14 19:16

    For Androidx in Feb 2020

    Others answers were not worked in Androidx for me. I implemented Settings from Android Developers guides

    See below guide for implementing click listener

    1) Implement PreferenceManager.OnPreferenceTreeClickListener in your settings fragment, like below code

    import androidx.preference.PreferenceManager;
    
    class SettingsFragment extends PreferenceFragmentCompat implements PreferenceManager.OnPreferenceTreeClickListener {
    

    2) Override onPreferenceTreeClick inside your SettingsFragment

    @Override
    public boolean onPreferenceTreeClick(Preference preference) {        
        String key = preference.getKey();
    
            switch (key) {
                case "key1":
                    return true;
    
                case "key2":
                    return true;
    
                //codes    
            }
    }
    
    0 讨论(0)
  • 2020-12-14 19:19

    You could also find the preference and set the click listener.

    Preference connectToNewComputer= findPreference("connectToNewComputer");
    connectToNewComputer.setOnPreferenceClickListener(this);
    
    0 讨论(0)
提交回复
热议问题