Comment créer une activité de préférence et un Fragment de préférence sur Android?

comme je suivais un ancien tutoriel ( Créez des applications pour Android -> openclassroom ) j'ai été bloqué sur cette méthode dépréciée addPreferencesFromResource(int id) de la classe PreferenceActivity.

donc ma question Est:

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

35
demandé sur WannaGetHigh 2014-05-07 20:54:27

2 réponses

j'ai trouvé ce post ( Que dois-je utiliser au lieu de" addPreferencesFromResource " dans une activité de préférence? ) qui m'aident à comprendre que vous devez passer par un PreferenceFragment pour le faire.

dans l'explication suivante, j'utilise your.package. juste pour montrer que vous devez mettre le nom du paquet. Tout le monde a son propre paquet alors veuillez le remplacer par votre paquet.

commençons:


1. Fragment De Préférence

  • créez votre classe de fragment préféré

    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 D'activité de préférence

    Mypreference activity "1519380920

    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 outrepasser isValidFragment(String fragmentName) méthode que vous allez obtenir frappé au visage par votre application ! ;) Plus sérieusement je n'ai aucune idée pourquoi vous devez faire cela, mais il est nécessaire. Si quelqu'un a une explication à ce sujet, je le lirais volontiers:)

    EDIT:


    merci à kirtan403 I maintenant savoir pourquoi il est nécessaire : elle doit être établie en raison d'une ( android cadre fragment d'injection ).


    comme vous pouvez le voir dans le onBuildHeaders(List<Header> target) nous chargeons un autre fichier xml qui contient 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 est la partie droite (pour tablette). Pour un téléphone, vous aurez d'abord les en-têtes et lorsque vous cliquez sur un élément le fragment correspondant sera placé en haut de la liste des en-têtes.

    Lire cet article ( Multi-volet développement Android avec des Fragments - Tutoriel ) les images expliquent eux-mêmes.



  • 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 avez peut-être remarqué dans la section en-tête vous avez:

    android:fragment="your.package.MyPreferenceFragment"

    ceci servira de lien vers le fragment que vous voulez montrer. Sur la tablette il se chargera sur la partie droite et sur le téléphone il se chargera sur le dessus de la vue actuelle.




3. Androïde Manifeste

maintenant, ce que vous devez faire est d'ajouter votre activité dans le fichier AndroidManifest.xml .

dans la section application ajouter ces lignes:

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

vous me direz probablement:

"Oh darling vous avez oublié de mettre android:launchMode="singleTask" dans votre activity "

mais ne mettez pas ce car vous ne chargerez jamais votre fragment sur le téléphone. Cette erreur a été résolue par un grand homme ! C'est le lien vers son blog ( Android-tête des préférences sur le petit écran de téléphone mobile/ ).




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

enfin vous devez ajoutez la possibilité de montrer cette préférence !! Pour ce faire, vous aurez besoin de 3 choses :

  • Le Menu

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



  • PreferenceActivity) selon la méthode onCreateOptionsMenu(Menu menu)

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



  • démarrage de l'activité MyPreferenceActivity lorsque vous cliquez sur ce bouton.

    pour cela, vous devrez outrepasser 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 modifié à partir de mon propre code pour ne pas avoir bien copié les choses collées. Si vous rencontrez des erreurs dites-moi, je vais essayer de comprendre le problème et le corriger.

j'espère que ce post aidera certaines personnes là-bas :D

santé !

91
répondu WannaGetHigh 2017-05-23 11:54:58

j'ai aimé la solution de ce post: http://alvinalexander.com/android/android-tutorial-preferencescreen-preferenceactivity-preferencefragment

.. parce qu'elle semble la plus compacte pour quelqu'un qui a juste besoin de quelque chose de très basique et qui fonctionne rapidement. Il n'a qu'un seul .fichier java et deux petits fichiers xml.

Activité Config RAPPELS

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

a) Ajouter L'activité Prefs au Manifeste fichier

B) Ajouter un moyen de lancer L'activité Prefs .. par exemple, un bouton ou un élément de Menu

ajoutez les fichiers suivants à votre projet. Utiliser l'ordre de la liste pour éviter les erreurs de compilation.

  1. Ajouter /res/values/matrice.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/préférences.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);
        }
    }
    
17
répondu gnB 2016-11-10 19:05:31