90 votes

Alternatives à PreferenceFragment avec Android-support-v4

Je suis arrivé à un arrêt soudain dans le développement de mon application quand j'ai réalisé que PreferenceFragments n'était pas supporté dans cette bibliothèque. Existe-t-il des alternatives qu'un développeur Android débutant peut utiliser pour surmonter cet obstacle ?

Voici ma fenêtre principale pour l'instant

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<TabHost
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0"/>

        <FrameLayout
            android:id="@+android:id/realtabcontent"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>

                <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            />

</TabHost>
</LinearLayout>

Pour mon activité TabActivity, j'utilise quelque chose que j'ai trouvé en ligne. Voici un extrait :

public class TabControlActivity extends FragmentActivity implements TabHost.OnTabChangeListener 
{
public static final int INSERT_ID = Menu.FIRST;
public static TabControlActivity thisCtx;
private TabHost mTabHost;
private HashMap mapTabInfo = new HashMap();
private TabInfo mLastTab = null;

private class TabInfo {
     private String tag;
     private Class clss;
     private Bundle args;
     private Fragment fragment;
     TabInfo(String tag, Class clazz, Bundle args) {
         this.tag = tag;
         this.clss = clazz;
         this.args = args;
     }

}

class TabFactory implements TabContentFactory 
{

    private final Context mContext;

    /**
     * @param context
     */
    public TabFactory(Context context) {
        mContext = context;
    }

    /** (non-Javadoc)
     * @see android.widget.TabHost.TabContentFactory#createTabContent(java.lang.String)
     */
    public View createTabContent(String tag) {
        View v = new View(mContext);
        v.setMinimumWidth(0);
        v.setMinimumHeight(0);
        return v;
    }

}

...*snip*...

Est-il possible d'implémenter quelque chose qui ressemble à un preferencefragment (ou preferenceActivity) en utilisant la bibliothèque de compatibilité Android-support-v4 ?

86voto

Subin Sebastian Points 2387

MISE À JOUR - 6/11/2015

La bibliothèque Support-v7 comprend désormais PreferenceFragmentCompat . Il est donc préférable de l'utiliser.


Ajoutez le projet suivant comme projet de bibliothèque à votre application.

https://github.com/kolavar/Android-support-v4-preferencefragment

Vous pouvez tout garder tel quel, y compris votre transaction de fragment. Lorsque vous importez le PreferenceFragment assurez-vous que l'en-tête d'importation correcte est utilisateur.

import android.support.v4.preference.PreferenceFragment;

au lieu de

import android.preference.PreferenceFragment;

16voto

mattblang Points 1229

Mise à jour importante : Le site dernière révision de la v7 support library dispose désormais d'une PréférenceFragmentCompat .

J'utilise cette bibliothèque qui a une AAR sur mavenCentral de sorte que vous pouvez facilement l'inclure si vous utilisez Gradle .

compile 'com.github.machinarius:preferencefragment:0.1.1'

10voto

BladeCoder Points 679

Vous pouvez utiliser mes propres PreferenceFragment .

C'est simple et je n'ai eu aucun problème avec ça jusqu'à présent. Je pense que vous ne pouvez en afficher qu'un seul à la fois dans une seule activité, ce qui devrait être correct.

7voto

Snicolas Points 19644

Vous pourriez peut-être utiliser une activité réelle et utiliser le fragment, mais je ne pense pas que ce soit un bon choix. Vous devriez utiliser une simple PreferenceActivity et attendre les améliorations des librairies rétro-compatibles.

2voto

MarcoDuff Points 101

Vous pouvez utiliser des bibliothèques tierces telles que Préférences unifiées pour utiliser une API unique pour toutes les versions d'Android.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X