studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android android-support-library support-preference

para - manual de programacion android pdf



¿Cómo utilizar la biblioteca de soporte de preferencias v7/v14? (5)

Junto con la versión M, hay nuevas bibliotecas de soporte. Una de ellas 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?


Con la nueva biblioteca de soporte de preferencias v7, puede usar 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 forma, puede personalizar el tema de preferenceTheme para diseñar los diseños utilizados para cada tipo de preferencia sin afectar otras partes de su actividad.


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

Simplemente use etiquetas xml de preferencia normal como PreferenceScreen lugar del nombre completo de la clase. La biblioteca de soporte los convertirá automáticamente.

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

Entonces deberías escribir xml así:

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


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

Este es un ejemplo de cómo inyectar AppCompatDelegate en su actividad a partir de las muestras de AppCompat de Google. Puede encontrarlo here .


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

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

No he podido resolverlos, así que he 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 el siguiente diseño para SettingsActivity:

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


AppCompatActivity 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 lógica de inflación de preferencia. Y por último, el tema de su actividad debe especificar un atributo preferenceTheme .

Lee el anuncio plus.google.com/+AndroidDevelopers/posts/9kZ3SsXdT2T . Con la biblioteca 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 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 / preferencias.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>

valores / 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>