¿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?
- Estilo SwipeRefreshLayout en r21 de la biblioteca de soporte
- PreferenceFragmentCompat se bloquea en initalization
- ¿Cómo usar SwipeRefreshLayout?
- Cómo cambiar la anchura de Android PopupMenu
- Soporte para Android Tipo de entrada EditTextPreference
- Paquete de soporte de Android / Biblioteca de Compatibilidad - use v4 o v13?
- Diseño personalizado PreferenceFragmentCompat
- Generar APKLIB de compatibilidad-v7-appcompat
- ¿Por qué no puedo importar AndroidJUnit4 y ActivityTestRule en mi clase de prueba de unidad?
- Recyclerviews y SwipeRefreshLayout utilizando la biblioteca de soporte 23.2.0
- ¿Cambiar la visibilidad de contraseña de Android no funciona con la biblioteca de soporte 25?
- Android-support-v4 error generado con la eliminación de R.java
- Appcompat, compatibilidad y bibliotecas de soporte para Lollipop si SDK mínimo = 14
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
- Android: Animación de cambios en el contenido de GridView
- Cómo obtener el código de país de teléfono con Android