web-dev-qa-db-fra.com

Comment créez-vous l'activité et le fragment de préférence sur Android?

Comme je suivais un ancien tutoriel ( Créez-vous des applications pour Android -> openclassroom )), je me suis retrouvé coincé sur cette méthode obsolète addPreferencesFromResource(int id) de PreferenceActivity classe.

Donc ma question est:

Quelle est la nouvelle façon de créer des préférences dans Android?

40
WannaGetHigh

J'ai trouvé ce post ( Que faut-il utiliser à la place de "addPreferencesFromResource" dans une préférenceActivity? ) qui m'aide à comprendre que vous devez passer par un PreferenceFragment pour pouvoir le faire.

Dans l'explication suivante, j'utilise your.package. Simplement pour montrer que vous devez mettre le nom du paquet. Tout le monde a son propre paquet, merci de le remplacer par votre paquet.

commençons :


1. Fragment de préférence

  • Créez votre classe PreferenceFragment

    MyPreferenceFragment

    public class MyPreferenceFragment extends PreferenceFragment
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.fragment_preference);
        }
    }
    


  • Puis la ressource XML associée

    fragment_preference.xml (dans le dossier res/xml de votre projet)

    <?xml version="1.0" encoding="utf-8"?>
    
    <PreferenceScreen
        xmlns:Android="http://schemas.Android.com/apk/res/Android">
    
        <PreferenceCategory 
            Android:title="FOO">
    
            <CheckBoxPreference
                Android:key="checkBoxPref"
                Android:title="check it out"
                Android:summary="click this little box"/>
    
        </PreferenceCategory>
    
    </PreferenceScreen>
    

    C'est tout pour la partie Fragment.



2. Activité de préférence

  • Créer la classe PreferenceActivity

    MyPreferenceActivity

    public class MyPreferenceActivity extends PreferenceActivity
    {
        @Override
        public void onBuildHeaders(List<Header> target)
        {
            loadHeadersFromResource(R.xml.headers_preference, target);
        }
    
        @Override
        protected boolean isValidFragment(String fragmentName)
        {
            return MyPreferenceFragment.class.getName().equals(fragmentName);
        }
    }
    

    N'oubliez pas pour remplacer la méthode isValidFragment(String fragmentName), car votre application vous donnera un coup de poing! ;) Plus sérieusement, je ne sais pas pourquoi vous devez faire cela, mais c'est nécessaire. Si quelqu'un a une explication à ce sujet, je le lirai volontiers :)

    MODIFIER :


    Grâce à kirtan403, je sais maintenant pourquoi il est nécessaire: il doit être défini à cause d'un ( injection de fragment de cadre Android ).


    Comme vous pouvez le voir dans la onBuildHeaders(List<Header> target), nous chargeons un autre fichier XML contenant les en-têtes de la préférence. En bref, les en-têtes sont la partie gauche de la préférence et le fragment, la partie droite (pour la tablette). Pour un téléphone, vous aurez d’abord les en-têtes, puis lorsque vous cliquez sur un élément, le fragment correspondant est placé en haut de la liste des en-têtes.

    Lisez cet article ( Développement multi-volets dans Android avec Fragments - Tutorial )), les images s’expliquent.


  • Puis la ressource XML associée

    headers_preference.xml (dans le dossier res/xml de votre projet)

    <?xml version="1.0" encoding="utf-8"?>
    
    <preference-headers
        xmlns:Android="http://schemas.Android.com/apk/res/Android">
    
        <header 
            Android:fragment="your.package.MyPreferenceFragment"
            Android:title="Goto: Preference fragment"
            Android:summary="An example of some preferences." />
    
    </preference-headers>
    

    Comme vous l'avez peut-être remarqué dans la section de l'en-tête , vous avez:

    Android:fragment="your.package.MyPreferenceFragment"

    Cela agira comme un lien vers le fragment que vous voulez montrer. Sur tablette, il se chargera sur la partie droite et sur le téléphone, il se chargera au-dessus de la vue actuelle.



3. Android Manifeste

Maintenant, ce que vous devriez faire est d’ajouter votre activité au fichier AndroidManifest.xml.

Dans la section application, ajoutez ces lignes:

<activity
    Android:name="your.package.MyPreferenceActivity"
    Android:label="Preferences">
</activity>

Vous allez probablement me dire:

"Oh, chérie, tu as oublié de mettre Android: launchMode =" singleTask " dans ton activité"

Mais NE METTEZ PAS CELA car vous ne chargerez jamais votre fragment sur votre téléphone. Cette erreur a été résolue par un grand homme! Ceci est le lien vers son blog ( préférences d'en-tête Android sur petit écran/téléphone ).



4. Démarrer les préférences à partir du menu

Enfin, vous devez ajouter la possibilité d'afficher cette préférence !! Pour ce faire, vous aurez besoin de 3 choses:

  • Le menu

    menu.xml (dans le dossier res/menu de votre projet)

    <?xml version="1.0" encoding="utf-8"?>
    
    <menu 
        xmlns:Android="http://schemas.Android.com/apk/res/Android">
    
        <item 
            Android:id="@+id/preferences"
            Android:title="Preferences" />
    
    </menu>
    


  • Chargement de ce menu dans votre activité principale (pas dans PreferenceActivity) avec la méthode onCreateOptionsMenu(Menu menu)

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }
    


  • Démarrer l'activité MyPreferenceActivity lorsque vous cliquez sur ce bouton.

    Pour cela, vous devrez remplacer la méthode onOptionsItemSelected(MenuItem item) dans votre activité principale.

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch(item.getItemId())
        {
            case R.id.preferences:
            {
                Intent intent = new Intent();
                intent.setClassName(this, "your.package.MyPreferenceActivity");
                startActivity(intent);
                return true;
            }
        }
    
        return super.onOptionsItemSelected(item);
    }
    



Et voila les amis!

Je n'ai pas testé ce code. Je l'ai pris et l'ai modifié à partir de mon propre code afin de ne pas avoir copié les choses collées. Si vous rencontrez des erreurs, dites-moi, je vais essayer de comprendre le problème et de le résoudre.

J'espère que ce post aidera certaines personnes: D

À votre santé !

101
WannaGetHigh

J'ai aimé la solution de cet article: http://alvinalexander.com/Android/android-tutorial-preferencescreen-preferenceactivity-preferencefragment

.. parce que cela semble le plus compact pour quelqu'un qui a juste besoin de quelque chose de très basique pour pouvoir fonctionner rapidement. Il ne contient qu'un fichier .Java et deux petits fichiers XML.

RAPPELS de configuration d'activité

Après avoir ajouté les 3 fichiers à votre projet, n'oubliez pas de

A) Ajouter le fichier Prefs Activity to Manifest
B) Ajoutez un moyen de lancer l’activité Prefs .. par exemple, un bouton ou un élément de menu

Ajoutez les fichiers suivants à votre projet. Utilisez l'ordre dans lequel ils sont listés pour éviter les erreurs de compilation.

  1. Ajouter /res/values/array.xml

    <resources>
        <string-array name="listArray">
            <item>Ace</item>
            <item>Club</item>
        </string-array>
    
        <string-array name="listValues">
            <item>Ace</item>
            <item>Club</item>
        </string-array>
    </resources>
    
  2. Ajouter /res/xml/preferences.xml

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">
        <EditTextPreference Android:title="Your Name"
                            Android:key="username"
                            Android:summary="Please provide your username"></EditTextPreference>
        <CheckBoxPreference Android:title="Application Updates"
                            Android:defaultValue="false"
                            Android:summary="This option if selected will allow the application to check for latest versions."
                            Android:key="applicationUpdates" />
        <ListPreference     Android:title="Download Details"
                            Android:summary="Select the kind of data that you would like to download"
                            Android:key="downloadType"
                            Android:defaultValue="Ace"
                            Android:entries="@array/listArray"
                            Android:entryValues="@array/listValues" />
    </PreferenceScreen>
    
  3. Ajouter le code d'activité

    public class AppPreferenceActivity extends PreferenceActivity
    {
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            getFragmentManager().beginTransaction().replace(Android.R.id.content, new MyPreferenceFragment()).commit();
    
            checkValues();
        }
    
        public static class MyPreferenceFragment extends PreferenceFragment
        {
            @Override
            public void onCreate(final Bundle savedInstanceState)
            {
                super.onCreate(savedInstanceState);
                addPreferencesFromResource(R.xml.preferences);
            }
        }
    
        private void checkValues()
        {
            SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
            String strUserName = sharedPrefs.getString("username", "NA");
            boolean bAppUpdates = sharedPrefs.getBoolean("applicationUpdates",false);
            String downloadType = sharedPrefs.getString("downloadType","1");
    
            String msg = "Cur Values: ";
            msg += "\n userName = " + strUserName;
            msg += "\n bAppUpdates = " + bAppUpdates;
            msg += "\n downloadType = " + downloadType;
    
            Toaster.shortDebug(msg);
        }
    }
    
19
Gene Bo