web-dev-qa-db-fra.com

Méthode findPreference () non obsolète? - Android

Je veux détecter quand un Preference contenu dans un ListView est cliqué, afin de pouvoir lancer une intention de gérer cette sélection.

J'aurais fait comme ceci dans mon fichier de mise en page XML:

<Preference Android:title="About" Android:key="myKey"></Preference>

Et ce qui suit dans mon code Java:

Preference myPref = (Preference) findPreference("myKey");
myPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
             public boolean onPreferenceClick(Preference preference) {
                 //open browser or intent here
             }
         });

Mais la méthode public Preference findPreference (CharSequence key) est obsolète.

  1. Existe-t-il un équivalent non déconseillé?
  2. Si non, si je l'utilise quand même?
  3. Comment Fragments peut-il m'aider à mieux faire mon travail? Cliquez ici: Préférences sans méthodes obsolètes .

Ici, vous pouvez vérifier la structure de mise en page XML de mon activité et un instantané de l'application:

XML:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <Preference 
        Android:key="about" 
        Android:title="@string/titleAbout" 
        Android:summary="@string/summaryAbout" 
    />

    <Preference 
        Android:key="labelTaxonomy" 
        Android:title="@string/titleLabelTaxonomy" 
        Android:summary="@string/summaryLabelTaxonomy" 
    />

</PreferenceScreen>

SNAPSHOT:

snapshopt

Après avoir cliqué sur la (à propos de la taxonomie A propos de (ou de la taxonomie des étiquettes d’accès) Preference, je voudrais ouvrir une intent de quelque sorte que ce soit (cela pourrait aussi être une vidéo ou autre chose ... les noms sont trompeurs). 

41
Matteo

Existe-t-il un équivalent non déconseillé?

Si vous utilisez PreferenceFragment sur des périphériques API de niveau 11+, vous appelez findPreference() dessus. Sinon, appelez findPreference() sur votre PreferenceActivity, car vous n’avez pas le choix.

Si non, si je l'utilise quand même?

Ça va marcher.

Comment les fragments peuvent-ils m'aider à mieux faire mon travail?

L'API de niveau 11+ a introduit PreferenceFragment comme une autre façon de construire le contenu d'une PreferenceActivity. Vous pouvez les utiliser, mais si vous continuez à utiliser des appareils plus anciens, vous ne pouvez pas utiliser PreferenceFragment pour ces appareils.

Cela étant dit:

Je veux détecter quand une préférence contenue dans une ListView est cliquée, afin de pouvoir lancer une intention de gérer cette sélection.

Vous n'avez pas besoin de code Java pour cela. Utilisation:

    <PreferenceScreen
            Android:title="@string/title_intent_preference"
            Android:summary="@string/summary_intent_preference">

        <intent Android:action="Android.intent.action.VIEW"
                Android:data="http://www.Android.com" />

    </PreferenceScreen>

(comme indiqué dans le JavaDocs pour PreferenceActivity )

Cela créera une entrée dans l'interface utilisateur des préférences qui, une fois cliquée, lancera une activité avec la variable Intent spécifiée.

60
CommonsWare

Si vous utilisez des fragments, vous pouvez utiliser la méthode "findPreference ()" sur la base d'un fragment de préférences.

public class CustomActivity extends PreferenceActivity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_custom);

      CustomFragment customFragment = (CustomFragment) getFragmentManager().findFragmentById(R.id.custom_fragment);
      EditTextPreference textPreference = (EditTextPreference) customFragment.findPreference("preference_key");

      textPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
         public boolean onPreferenceClick(Preference preference) {
             //open browser or intent here
         }
     });
  }
}
4
kaffee_kocher

peut-être que docs link ne sont pas clairs. Mais utiliser cette fonctionnalité est très simple. par exemple, vous pouvez l'utiliser comme une page Twitter comme celle-ci

<PreferenceCategory Android:title="Share" >
 <PreferenceScreen
        Android:title="Twitter"
        Android:summary="Follow me at Twitter">

    <intent Android:action="Android.intent.action.VIEW"
            Android:data="https://Twitter.com/" />

</PreferenceScreen>
</PreferenceCategory>

il n'a pas besoin de code Java. Merci à CommonsWare!

1
mehmet

2018 UPDATE Aujourd'hui, la méthode onPreferenceTreeClick doit être remplacée dans le fragment Préférence à cette fin. Par exemple:

public class MySettingsFragment extends PreferenceFragment {

    @Override
    public boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen,
                                          Preference preference)
    {
        String key = preference.getKey();
        if(key.equals("someKey")){
            // do your work
            return true;
        }
        return false;
    }
}
0
akelec