Alternatives à PreferenceFragment avec android-support-v4

Je me suis brusquement arrêté dans le développement de mon application car j'ai compris que PreferenceFragments n'était pas pris en charge dans cette bibliothèque. Existe-t-il des solutions de rechange qu'un développeur Android novateur peut utiliser pour surmonter cet obstacle?

C'est ma fenêtre principale dès maintenant

<?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 ma 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 de mettre en œuvre quelque chose qui ressemble à un fragment de préférence (ou preferenceActivity) à l'aide de la bibliothèque de compatibilité android-support-v4?

  • Comment attribuer des boutons sur différents spots de 70 images séparément?
  • API GetParentFragment 16
  • La bibliothèque d'assistance v4 utilise-t-elle de nouvelles classes lorsque disponibles?
  • Comment instancier la classe de fragment en utilisant le nom de la classe au lieu de l'index
  • Cycle de cycle des fragments: onCreateView () non appelé lors de l'utilisation du bouton Retour
  • Android - Comment cacher l'option de menu pour le fragment actuel
  • Fragment sur la rotation de l'écran
  • Android: Supprime TOUTES les FragmentTransactions de la pile arrière
  • 9 Solutions collect form web for “Alternatives à PreferenceFragment avec android-support-v4”

    MISE à JOUR – 11/06/2015

    La bibliothèque Support-v7 comprend maintenant PreferenceFragmentCompat . Donc, ce sera une meilleure idée de l'utiliser.


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

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

    Vous pouvez tout garder, y compris votre transaction de fragment tel qu'il est. Lors de l'importation de la classe PreferenceFragment , assurez-vous que l'en-tête d'importation correct est un utilisateur.

     import android.support.v4.preference.PreferenceFragment; 

    au lieu de

     import android.preference.PreferenceFragment; 

    Je sais que c'est une ancienne question, mais maintenant, vous pouvez utiliser PreferenceFragmentCompat partir de com.android.support:preference-v7:23.3.0

    Mise à jour importante: la dernière version de la v7 support library dispose désormais d'un PreferenceFragmentCompat natif.

    J'utilise cette bibliothèque , qui a un AAR dans mavenCentral afin que vous puissiez l'inclure facilement si vous utilisez Gradle .

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

    Vous pouvez utiliser mon propre PreferenceFragment .

    C'est simple et je n'ai eu aucun problème à ce jour. Je pense que vous ne pouvez afficher l'un d'eux qu'à la fois dans une seule activité, ce qui devrait être correct.

    Bibliothèque de support de préférences: Fragments de préférence pour API 7+, peu importe l'activité

    Une implémentation simple comprendrait un PreferenceFragmentCompat tel que:

     public class PreferencesFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.preferences); } } 

    Vous devrez également définir preferenceTheme dans votre thème:

     <style name="AppTheme" parent="@style/Theme.AppCompat.Light"> <item name="preferenceTheme">@style/PreferenceThemeOverlay</item> </style> 

    Et ajoutez ceci dans les dépendances: http://developer.android.com/tools/support-library/features.html

     com.android.support:preference-v14:23.1.0 

    Vous pouvez utiliser une activité réelle et utiliser un fragment, mais je ne pense pas que c'est un bon choix. Vous devez utiliser PreferenceActivity simple et attendre des améliorations dans les libs compatibles rétro.

    Vous pouvez utiliser des bibliothèques tierces telles que UnifiedPreferences pour utiliser une seule API pour toutes les versions d'Android.

    Vous pouvez étendre à partir de PreferenceActivity , et si vous souhaitez disposer d'un ActionBar, vous pouvez l'ajouter à l'aide d'une barre d' outils au-dessus de ListView utilisée pour les préférences.

    Cela peut se faire en utilisant un LinearLayout vertical qui contient la barre d'outils et une ListView avec Android: id = "@ android: id / list" .

    Si vous le souhaitez, vous pouvez voir ma solution ici .

    Comme Lucius l'a dit, vous pouvez utiliser PreferenceFragmentCompat :

     public class MyPreferenceFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle bundle, String s) { PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false); addPreferencesFromResource(R.xml.preferences); } } 

    Vous devez inclure sa dépendance dans gradle:

     dependencies { ... compile 'com.android.support:preference-v7:23.1.X' (wherX = 0,1,...) ... } 

    De cette façon, vous pouvez également utiliser FragmentTransaction de android.support.v4.app.FragmentTransaction et PrefernceFragment. Cependant, vous avez peut-être des problèmes avec les thèmes. Si c'est le cas, vous pouvez le résoudre en tenant compte de cette publication:

    Solution pour que la lib fonctionne sur l'API 7+ tout en conservant le thème matériel sur API 14+

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.