web-dev-qa-db-fra.com

Activité de préférence sur le clic de préférence Listener

Je construis une activité de préférences dans laquelle la plupart des préférences de la liste exécuteront du code et ne modifieront pas directement une référence partagée. Mon fichier preferences.xml ressemble à ceci.

<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>

Mon objectif est de faire exécuter un bloc de code lorsque l’une de ces préférences est cliquée. Identique à "Effacer l'historique des recherches" dans le menu des préférences de paramètres de Google Play. ( http://i.imgur.com/qnHbJX9.png

Est-ce que quelqu'un sait comment rendre cela possible?

Je dois ajouter que j'ai essayé d'utiliser findPreference ("KeyNameHere") mais qu'il renvoie toujours null.

Je vous remercie!


Modifier:

J'ai ajouté dans ce code et mis en œuvre OnPreferenceClickListener:

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

Mais cette méthode n'est jamais appelée. Y a-t-il une autre façon de faire cela?


Éditer 2:

J'ai constaté que si je retirais les balises PreferenceCategory, il me restait donc ceci: 

<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" />

et appelez ceci:

getPreferenceScreen().setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {

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

alors je reçois une réponse de l'événement click. Le seul inconvénient est que je dois supprimer le groupe de préférences. Quelqu'un sait pourquoi et comment y remédier?

14
BarryBostwick

Je suis venu avec ma propre solution (ce que je crois est vraiment foiré); mais ça marche.

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;
                }

            });
        }
    }

Ce que j’ai appris, c’est qu’il existe un système hiérarchique qui fonctionne de la manière suivante: PreferenceScreen a des enfants PreferenceCategory a des enfants Preference, comme vous pouvez le voir dans le fichier XML. Mon problème était que je ne pouvais pas définir les préférences onClickListeners directement à partir de PreferenceScreen. J'ai donc créé deux boucles for qui vont descendre à chaque préférence et définir un OnPreferenceClickListener pour chacune d'entre elles. En désordre, mais fonctionne finalement. 

8
BarryBostwick

Implémenter OnPreferenceClickListener et dans la onPreferenceClick 

@Override
public boolean onPreferenceClick (Preference preference)
{
    String key = preference.getKey();
    // do what ever you want with this key
}
14
Hoan Nguyen

Cela ne serait peut-être pas utile pour OP mais pour quelqu'un d'autre. J'aimerais écrire une sorte de résumé. En général, vous pouvez suivre principalement trois méthodes: 1) vous pouvez trouver votre préférence quelque part dans votre code avec

Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE);

et ensuite vous pouvez ajouter un écouteur de clic et remplacer sa méthode de clic avec

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

Ceci doit être fait pour chaque préférence dont vous voulez écouter les clics 2) Vous pouvez implémenter l'interface Preference.OnPreferenceClickListener dans vos paramètres/fragment de paramètres et remplacer onPreferenceClick une seule fois, à l'aide d'une construction de commutateur ou d'un if. else if-else if -... construit et fusionne toutes les manipulations simples; cela devrait être quelque chose comme:

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

Ensuite, vous devez toujours trouver chaque préférence, mais vous pouvez simplement appeler chacune d’elles.

setOnPreferenceClickListener(this);

(Je pense que l'implémentation de l'OP n'a pas fonctionné (sa méthode n'a pas été appelée) à cause de cette dernière partie) Nous passons "this" en paramètre parce que nous avons implémenté l'interface auditeur de clics

3) (que je pense être le plus facile), vous pouvez remplacer

onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)

dans votre fragment/activité de préférence sans implémenter aucune autre interface et là vous pouvez copier le commutateur de la construction if-else if -... de l'option 2); Le principal avantage est que vous n'avez pas besoin de trouver chaque préférence et de l'appeler setOnPreferenceClickListener.

J'espère que cela sera utile pour quelqu'un!

9
bd95

Juste remplacer:

@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {

    String key = preference.getKey();
    ...

    return super.onPreferenceTreeClick(preferenceScreen, preference);
}
8
marmor

Vous pouvez également trouver la préférence et définir l'écouteur de clics.

Preference connectToNewComputer= findPreference("connectToNewComputer");
connectToNewComputer.setOnPreferenceClickListener(this);
8
Apirak Lunla

Votre objet Préférence ne deviendra pas nul si vous trouverez les éléments suivants (Copypartage du projet):

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
CodeToLife