Cómo organizar tu configuración Parte de Android Jetpack.
Un usuario puede tener dificultades en las pantallas de configuración grandes y complejas a la hora de encontrar una configuración específica que quiera cambiar. La biblioteca de Preference ofrece las siguientes formas de organizar mejor tus pantallas de configuración.
Categorías de Preference
Si tienes varios objetos Preference
relacionados en una sola pantalla, puedes agruparlos mediante un PreferenceCategory
. Un objeto PreferenceCategory
muestra el título de una categoría y la separa visualmente.
Para definir un PreferenceCategory
en XML, une las etiquetas Preference
con un PreferenceCategory
, como se muestra a continuación:
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> <PreferenceCategory app:key="notifications_category" app:title="Notifications"> <SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/> </PreferenceCategory> <PreferenceCategory app:key="help_category" app:title="Help"> <Preference app:key="feedback" app:summary="Report technical issues or suggest new features" app:title="Send feedback"/> </PreferenceCategory> </PreferenceScreen>
El resultado es similar al siguiente:
![Una imagen que muestra preferencias con categorías](https://developer.android.com/static/develop/ui/views/components/settings/images/settings-preferencecategory.png?authuser=8&hl=es)
Cómo dividir una jerarquía en varias pantallas
Si tienes una gran cantidad de objetos Preference
o categorías distintas, puedes mostrarlos en pantallas separadas. Cada pantalla es un objeto PreferenceFragmentCompat
con su propia jerarquía independiente. Los objetos Preference
de la pantalla inicial pueden vincularse a subpantallas que contengan preferencias relacionadas.
En la Figura 2, se muestra una jerarquía simple que contiene dos categorías: Mensajes y Sincronización.
![Una imagen que muestra una pantalla de preferencias con jerarquías](https://developer.android.com/static/develop/ui/views/components/settings/images/settings-simplehierarchy.png?authuser=8&hl=es)
En la Figura 3, se muestra el mismo conjunto de preferencias dividido en varias pantallas:
![Imagen que muestra una jerarquía dividida en varias pantallas](https://developer.android.com/static/develop/ui/views/components/settings/images/settings-screens.png?authuser=8&hl=es)
Para vincular pantallas con un Preference
, puedes declarar un app:fragment
en XML o usar Preference.setFragment()
.
Inicia el nombre completo del paquete de PreferenceFragmentCompat
cuando se presiona Preference
, como se muestra en el siguiente ejemplo:
<Preference app:fragment="com.example.SyncFragment" .../>
Cuando un usuario presiona un objeto Preference
con un objeto Fragment
asociado, se llama al método de la interfaz PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment()
. Ese método es donde controlas la visualización de la nueva pantalla y donde esta se implementa en el objeto Activity
circundante.
Una implementación típica será similar a la siguiente:
Kotlin
class MyActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPreferenceStartFragmentCallback { ... override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat, pref: Preference): Boolean { // Instantiate the new Fragment. val args = pref.extras val fragment = supportFragmentManager.fragmentFactory.instantiate( classLoader, pref.fragment) fragment.arguments = args fragment.setTargetFragment(caller, 0) // Replace the existing Fragment with the new Fragment. supportFragmentManager.beginTransaction() .replace(R.id.settings_container, fragment) .addToBackStack(null) .commit() return true } }
Java
public class MyActivity extends AppCompatActivity implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback { ... @Override public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) { // Instantiate the new Fragment. final Bundle args = pref.getExtras(); final Fragment fragment = getSupportFragmentManager().getFragmentFactory().instantiate( getClassLoader(), pref.getFragment()); fragment.setArguments(args); fragment.setTargetFragment(caller, 0); // Replace the existing Fragment with the new Fragment. getSupportFragmentManager().beginTransaction() .replace(R.id.settings_container, fragment) .addToBackStack(null) .commit(); return true; } }
PreferenceScreens
Ya no se admite la declaración de jerarquías anidadas dentro del mismo recurso XML con un <PreferenceScreen>
anidado. En su lugar, usa objetos Fragment
anidados.
Cómo usar objetos Activity individuales
Como alternativa, si necesitas personalizar mucho cada pantalla, o si quieres transiciones completas de Activity
, puedes usar un objeto Activity
individual para cada PreferenceFragmentCompat
. Al hacer esto, puedes personalizar totalmente cada Activity
y su pantalla de configuración correspondiente. Para la mayoría de las apps, no recomendamos esto. En su lugar, usa Fragments
como se describió anteriormente.
Si quieres obtener más información para iniciar un Activity
a partir de un Preference
, consulta Acciones de Preference.