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>