Alternativas a PreferenceFragment con android-support-v4

He llegado a una parada repentina en el desarrollo de mi aplicación, ya que me di cuenta de que PreferenceFragments no eran compatibles con esta biblioteca. ¿Hay alguna alternativa que un desarrollador androide novato puede utilizar para superar este obstáculo?

Esta es mi ventana principal desde ahora

<?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> 

Para mi TabActivity estoy usando algo que encontré en línea. He aquí un fragmento:

 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*... 

¿Hay alguna para implementar algo que se asemeje a un preferencia fragmentación (o preferenciaActividad) utilizando la biblioteca de compatibilidad android-support-v4?

ACTUALIZACIÓN – 6/11/2015

La biblioteca Support-v7 ahora incluye PreferenceFragmentCompat . Por lo tanto, será una mejor idea usarlo.


Agregue el proyecto siguiente como un proyecto de biblioteca a su aplicación.

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

Usted puede guardar todo incluyendo su transacción del fragmento como es. Al importar la clase PreferenceFragment , asegúrese de que el encabezado de importación correcto es user.

 import android.support.v4.preference.PreferenceFragment; 

en lugar de

 import android.preference.PreferenceFragment; 

Sé que esta es una vieja pregunta, pero ahora puedes usar PreferenceFragmentCompat desde com.android.support:preference-v7:23.3.0

Actualización importante: La última revisión de la v7 support library ahora tiene un PreferenceFragmentCompat nativo.

Estoy utilizando esta biblioteca , que tiene un AAR en mavenCentral para que pueda incluirlo fácilmente si está usando Gradle .

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

Puedes usar mi propio PreferenceFragment .

Es simple y no tuve problemas con él hasta ahora. Creo que sólo se puede mostrar uno de ellos a la vez en una sola actividad, que debería estar bien.

Preferences Support Library: Fragmentos de preferencia para API 7+, sin importar la actividad

Una implementación simple incluiría un PreferenceFragmentCompat como:

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

También tendrá que establecer el tema de preferencia en su tema:

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

Y agrega esto en dependencias: http://developer.android.com/tools/support-library/features.html

 com.android.support:preference-v14:23.1.0 

Podrías usar una actividad real y usar fragmentos, pero no creo que sea una buena opción. Debería usar PreferenceActivity y esperar a que aparezcan mejoras en las librerías retro compatibles.

Puede utilizar bibliotecas de terceros como UnifiedPreferences para utilizar una única API para todas las versiones de Android.

Puede extenderse desde PreferenceActivity en su lugar, y si desea tener una ActionBar, puede agregarla usando una barra de herramientas como si estuviera sobre el ListView utilizado para las preferencias.

Esto se puede hacer usando un LinearLayout vertical que contiene la barra de herramientas y un ListView con android: id = "@ android: id / list" .

Si lo desea, puede ver mi solución aquí .

Como Lucius dijo que puedes usar 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); } } 

Debe incluir su dependencia en gradle:

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

De esta manera también puede utilizar FragmentTransaction de android.support.v4.app.FragmentTransaction y PrefernceFragment. Sin embargo, tal vez tenga problemas con temas. Si es el caso, se puede resolver teniendo en cuenta este post:

Solución para hacer que la biblioteca funcione en API 7+ mientras mantiene el tema material en API 14+

  • Fragmento de diálogo con wrap_content que viene como una pantalla completa. ¿Cómo hacerlo como una altura de diseño y no una pantalla completa?
  • Fragmento de lanzamiento por nombre de variable
  • Listener para el ciclo de vida de los fragmentos
  • Cambiar fragmento viewpager por un botónClick
  • Llamar el show de DialogFragment () desde dentro onRequestPermissionsResult () provoca IllegalStateException en Marshmallow
  • ¿Cuál es la diferencia entre commit () y commitAllowingStateLoss () en Fragments
  • Android actualiza una lista de fragmentos de su actividad principal
  • DispatchTouchEvent in Fragment en Android
  • Eliminar un ViewPager mediante programación, ¿cuándo son (o cómo puedo asegurarlo) que se han destruido fragmentos?
  • Android Datepicker Fragment - ¿Cómo hacer algo cuando el usuario establece una fecha?
  • Mapapi v2 en android causando error en el fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.