¿Cómo utilizar la biblioteca de preferencias v7 / v14?

Junto con la versión M, hay nuevas bibliotecas de soporte. Uno de ellos que parece ser muy útil es la biblioteca v7 Preference Support .

No parece tener PreferenceActivity o algo similar, ¿cómo lo integramos a nuestra aplicación?

Tienes que extender AppCompatActivity , que se requiere para el fragmento, e incluir una subclase de PreferenceFragmentCompat . El fragmento abstracto requiere anular un método, en el que debe colocar su preferencia lógica de inflación. Y por último, el tema de su actividad necesita especificar un atributo preferenceTheme .

Lea el anuncio aquí . Con la biblioteca de preferencia-v7, puede reemplazar PreferenceFragment (API 11+) con la subclase PreferenceFragmentCompat y SwitchPreference (API 14+) con SwitchPreferenceCompat y hacer que su pantalla de configuración funcione desde la API 7.

A continuación se muestra cómo lo hice funcionar:

SettingsActivity.java

 public class SettingsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); } } 

Layout / activity_settings.xml

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <fragment android:name=".SettingsFragment" android:tag=".SettingsFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> 

SettingsFragment.java

 public class SettingsFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle bundle, String s) { addPreferencesFromResource(R.xml.preferences); } } 

Xml / preferences.xml

 <?xml version="1.0" encoding="utf-8"?> <android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.preference.PreferenceCategory ...> <android.support.v7.preference.ListPreference ... /> <android.support.v7.preference.SwitchPreferenceCompat ... /> ... </android.support.v7.preference.PreferenceCategory> ... </android.support.v7.preference.PreferenceScreen> 

Values ​​/ styles.xml

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

Tema predeterminado de preferencia-v7

 <style name="PreferenceThemeOverlay"> <item name="preferenceScreenStyle">@style/Preference.PreferenceScreen</item> <item name="preferenceFragmentStyle">@style/PreferenceFragment</item> <item name="preferenceCategoryStyle">@style/Preference.Category</item> <item name="preferenceStyle">@style/Preference</item> <item name="preferenceInformationStyle">@style/Preference.Information</item> <item name="checkBoxPreferenceStyle">@style/Preference.CheckBoxPreference</item> <item name="switchPreferenceCompatStyle">@style/Preference.SwitchPreferenceCompat</item> <item name="dialogPreferenceStyle">@style/Preference.DialogPreference</item> <item name="editTextPreferenceStyle">@style/Preference.DialogPreference.EditTextPreference</item> <item name="preferenceFragmentListStyle">@style/PreferenceFragmentList</item> </style> 

Con la nueva biblioteca de soporte de preferencias v7, puede utilizar PreferenceFragmentCompat con cualquier Activity o AppCompatActivity

 public static class PrefsFragment extends PreferenceFragmentCompat { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.preferences); } } 

Tienes que establecer el tema de preferenceTheme en tu tema:

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

De esta manera, puede personalizar el método preferenceTheme para diseñar los diseños utilizados para cada tipo de preferencia sin afectar a otras partes de su actividad.

La respuesta de hidro es correcta, pero una cosa más aquí notar:

Simplemente utilice las etiquetas xml normales de preferencia, como PreferenceScreen lugar del nombre completo de la clase. La biblioteca de soporte los convertirá automáticamente.

Por qué: Si usa el nombre de clase completo, la sugerencia de código y la vista previa de diseño no funcionarán correctamente.

Así que usted debe escribir xml como este:

 <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory ...> <ListPreference ... /> <SwitchPreferenceCompat ... /> ... </PreferenceCategory> ... </PreferenceScreen> 

Usted tiene razón de que no existe en el appcompat v7, pero Google realmente agregó AppCompatDelegate clase abstracta como un delegado que puede utilizar para inyectar el apoyo de AppCompat a cualquier actividad. Puedes encontrar más de esta respuesta .

Este es un ejemplo de cómo inyectar el AppCompatDelegate en su actividad a partir de las muestras de AppCompat de Google, puede encontrarlo aquí .

He intentado implementar la respuesta de Hidro anterior con una actividad que también contenía una barra de herramientas y me dio la siguiente una excepción de inflación de diseño debido al siguiente error:

Causado por: java.lang.NullPointerException: Intenta invocar el método virtual 'android.content.Context android.support.v4.app.FragmentHostCallback.getContext ()' en una referencia de objeto nulo

No he sido capaz de resolver estos, por lo que han recurrido a lo siguiente:

 public class SettingsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(savedInstanceState == null) getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, new SettingsFragment()).commit(); } } 

Con la siguiente disposición para la ConfiguraciónActividad:

 <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <include layout="@layout/toolbar"/> <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout> 

Publicado aquí, ya que puede ayudar si otras personas encuentran la misma excepción

  • Cómo ajustar la distancia de golpe hacia abajo en SwipeRefreshLayout?
  • Biblioteca de soporte de Android v7 + Maven + Eclipse: dependencia apklib no encontrada en el espacio de trabajo
  • Android SDK Versión 25 - android.support v7: 25 da "Ningún recurso encontrado que coincida con @ color / hint_foreground_material_light" Adobe Creative SDK?
  • Biblioteca de soporte de las pestañas personalizadas
  • SwipeRefreshLayout de la lib de soporte. V21 no funciona con contenido estático
  • No se pudo encontrar: com.android.support:support-v4:22.2.0
  • No se encontró ningún recurso que coincida con el nombre dado (en 'cardBackgroundColor' con el valor '? Android: attr / colorBackgroundFloating')
  • Android Multidex y bibliotecas de soporte
  • Cómo implementar más de 2 niveles de navegación en com.android.support:leanback-v17
  • Java.lang.NoClassDefFoundError: android / graphics / drawable / Icono
  • Recyclerview cubierto por BottomNavigationView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.