Android 8.0 introdujo una nueva arquitectura de la información para que la app de Configuración pueda simplificar la forma en que se organizan los parámetros de configuración y facilitar a los usuarios la encontrar rápidamente la configuración para personalizar sus dispositivos Android. Android 9 introdujo algunas mejoras para brindar más Funcionalidad de configuración y una implementación más sencilla
Ejemplos y fuente
Actualmente, la mayoría de las páginas de Configuración se implementan con el nuevo framework. Un buen
ejemplo es DisplaySettings:
packages/apps/Settings/src/com/android/settings/DisplaySettings.java
A continuación, se indican las rutas de acceso a los archivos para los componentes importantes:
- Clave de categoría:
packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
- DashboardFragmentRegistry:
packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
- DashboardFragment:
packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java
- AbstractPreferenceController:
frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
- BasePreferenceController (presentado en Android 9):
packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java
Implementación
Se recomienda a los fabricantes de dispositivos que adapten la información existente de la configuración.
e insertar páginas de configuración adicionales según sea necesario para
funciones específicas para socios. Mover las preferencias de una página heredada (implementadas como
SettingsPreferencePage
) a una nueva página (que se implementó mediante
DashboardFragment
) puede ser complicado. La preferencia de la
Es probable que la página heredada no se implemente con un PreferenceController
.
Por lo tanto, cuando mueves una preferencia de una página heredada a una nueva, debes crear una
PreferenceController
y mueve el código al controlador antes
y crear una instancia en el nuevo DashboardFragment
. Las APIs que
Los requisitos de PreferenceController
se describen en su nombre y
documentados en Javadoc.
Te recomendamos que agregues una prueba de unidades para cada PreferenceController
.
Si el cambio se envía al AOSP, se requiere una prueba de unidades.
Para obtener más información sobre cómo escribir pruebas basadas en Robolectric, consulta la
archivo readme packages/apps/Settings/tests/robotests/README.md
.
Arquitectura de la información tipo complemento
Cada elemento de configuración se implementa como una Preferencia. Una Preferencia puede ser se muevan de una página a otra.
Para facilitar el desplazamiento de múltiples parámetros de configuración, Android 8.0 introdujo Un fragmento de host tipo complemento que contiene elementos de configuración. Los elementos de configuración modelados como controladores estilo complemento. Por lo tanto, una página de configuración se crea un solo fragmento de host y varios controladores de configuración.
Fragmento de panel
DashboardFragment
es un host de controladores de preferencias de estilo de complemento.
El fragmento hereda de PreferenceFragment
y tiene enlaces a
expandir y actualizar tanto las listas de preferencias estáticas como las dinámicas.
Preferencias estáticas
Se define una lista de preferencias estáticas en XML con la etiqueta <Preference>
. R
La implementación de DashboardFragment
usa el
Método getPreferenceScreenResId()
para definir qué archivo en formato XML contiene
la lista estática de preferencias para mostrar.
Preferencias dinámicas
Un elemento dinámico representa una tarjeta con un intent que conduce a una ubicación externa o interna.
Actividad. Por lo general, el intent conduce a una página de configuración diferente. Por ejemplo:
el "Google" en la página principal de Configuración es un elemento dinámico. Dinámico
los elementos se definen en AndroidManifest
(se analizan a continuación) y se cargan
a través de un FeatureProvider
(definido como
DashboardFeatureProvider
)
La configuración dinámica es más pesada que la configuración estática. de configuración, por lo que, por lo general, los desarrolladores deberían implementar este parámetro como estático. Sin embargo, la configuración dinámica puede ser útil cuando se cumple alguna de las siguientes condiciones:
- El parámetro de configuración no se implementa directamente en la app de Configuración (por ejemplo, insertar un parámetro de configuración implementado por las apps del OEM o del operador).
- La configuración debería aparecer en la página principal de Configuración.
- Ya tienes una actividad para el parámetro de configuración y no quieres implementar la configuración estática adicional.
Para configurar una actividad como un parámetro de configuración dinámico, haz lo siguiente:
- Para marcar la actividad como un parámetro de configuración dinámico, agrega un filtro de intents a la actividad.
- Dile a la app de Configuración a qué categoría pertenece. La categoría es una constante,
definido en
CategoryKey
. - Opcional: Agrega texto de resumen cuando se muestre el parámetro de configuración.
Este es un ejemplo tomado de la app de Configuración de DisplaySettings
.
<activity android:name="Settings$DisplaySettingsActivity" android:label="@string/display_settings" android:icon="@drawable/ic_settings_display"> <!-- Mark the activity as a dynamic setting --> <intent-filter> <action android:name="com.android.settings.action.IA_SETTINGS" /> </intent-filter> <!-- Tell Settings app which category it belongs to --> <meta-data android:name="com.android.settings.category" android:value="com.android.settings.category.ia.homepage" /> <!-- Add a summary text when the setting is displayed --> <meta-data android:name="com.android.settings.summary" android:resource="@string/display_dashboard_summary"/> </activity>
En el tiempo de procesamiento, el fragmento solicitará una lista de Preferencias de ambas
La configuración XML y dinámica se define en AndroidManifest
. Ya sea que el campo
Los elementos PreferenceController
se definen en código Java o XML.
DashboardFragment
administra la lógica de control de cada parámetro de configuración.
hasta PreferenceController
(se analizan a continuación). Luego, se hace
se muestra en la IU como una lista mixta.
Controlador de preferencia
Existen diferencias entre la implementación de PreferenceController
en Android 9 y Android 8.x, como se describe en esta
sección.
PreferenceController en la versión de Android 9
Un PreferenceController
contiene toda la lógica para interactuar con el
preferencia, incluida la visualización, la actualización, la indexación de búsqueda, etc.
La interfaz de PreferenceController
se define de la siguiente manera:
BasePreferenceController
Por ejemplo, consulta el código en
packages/apps/Settings/src/com/android/settings/core/
BasePreferenceController.java
Hay varias subclases de BasePreferenceController
, cada una
la asignación a un estilo de IU específico que la app de Configuración admite de forma predeterminada. Para
Por ejemplo, TogglePreferenceController
tiene una API que mapea directamente
la forma en que el usuario debe interactuar
con una IU de preferencias basada en botones de activación.
BasePreferenceController
tiene APIs como
getAvailabilityStatus()
, displayPreference()
handlePreferenceTreeClicked(),
, etc. Documentación detallada para cada
La API está en la clase de la interfaz.
Una restricción sobre la implementación de BasePreferenceController
(y
sus subclases, como TogglePreferenceController
) es que el
la firma del constructor debe coincidir con alguna de las siguientes opciones:
public MyController(Context context, String key) {}
public MyController(Context context) {}
Mientras instalas una preferencia para el fragmento, el panel proporciona un método para
adjunta un PreferenceController
antes de la hora de visualización. En el momento de la instalación,
el controlador está conectado al fragmento para que todos los eventos relevantes futuros
enviados al controlador.
DashboardFragment
mantiene una lista de
PreferenceController
en la pantalla. A la altura del fragmento
onCreate()
, se invocan todos los controladores para la
getAvailabilityStatus()
. Si el resultado es verdadero,
Se invoca displayPreference()
para procesar la lógica de visualización.
getAvailabilityStatus()
también es importante indicarle a Configuración
un framework sobre qué elementos están disponibles durante la búsqueda.
PreferenceController en versiones de Android 8.x
Un PreferenceController
contiene toda la lógica para interactuar con el
preferencia, incluida la visualización, la actualización y la indexación de búsqueda. etcétera
Según las interacciones de preferencias, la interfaz de
PreferenceController
tiene las APIs isAvailable()
,
displayPreference()
, handlePreferenceTreeClicked()
, etcétera.
Puedes encontrar documentación detallada sobre cada API en la clase de interfaz.
Mientras instalas una preferencia para el fragmento, el panel proporciona un método para
adjunta un PreferenceController
antes de la hora de visualización. En el momento de la instalación,
el controlador está conectado al fragmento para que todos los eventos relevantes futuros
enviados al controlador.
DashboardFragment
mantiene una lista de PreferenceControllers
en la pantalla. En el onCreate()
del fragmento, todos
se invocan controladores para el método isAvailable()
, y si
devuelve el valor true, se invoca displayPreference()
para procesar la visualización
lógica.
Usa DashboardFragment
Cómo mover una preferencia de la página A a la B
Si la preferencia se indica estáticamente en el archivo XML de preferencias de la página original sigue el procedimiento de traslado estático para tu dispositivo Android a continuación. De lo contrario, sigue el procedimiento de traslado dinámico. para tu versión de Android.
Movimiento estático en Android 9
- Busca los archivos XML de preferencia para la página y el destino originales.
. Puedes encontrar esta información en
getPreferenceScreenResId()
. - Quita la preferencia del archivo XML de la página original.
- Agrega la preferencia al XML de la página de destino.
- Quita el
PreferenceController
de esta preferencia de la implementación de Java de la página original. Suele estar encreatePreferenceControllers()
El controlador se puede declarar en XML directamente.Nota: Es posible que la preferencia no tenga un
PreferenceController
- Crea una instancia de
PreferenceController
en el archivocreatePreferenceControllers()
Si el botónPreferenceController
está definido en XML en la página anterior y defínelo. en XML para la nueva página también.
Movimiento dinámico en Android 9
- Descubre qué categoría aloja la página original y la de destino. Puedes
encuentra esta información en
DashboardFragmentRegistry
. - Abre el archivo
AndroidManifest.xml
que contiene la configuración que tendrás que moverte y buscar la entrada de la actividad que representa este parámetro de configuración. - Establece el valor de metadatos de la actividad para
com.android.settings.category
a la clave de categoría de la página nueva
Movimiento estático en las versiones de Android 8.x
- Busca los archivos en formato XML de preferencia para la página original y la de destino. Puedes encontrar esta información en el método
- Quita la preferencia en el archivo XML de la página original.
- Agrega la preferencia al XML de la página de destino.
- Quita el atributo
PreferenceController
de esta preferencia en la implementación de Java de la página original. Por lo general, se encuentra engetPreferenceControllers()
- Crea una instancia de
PreferenceController
en el archivogetPreferenceControllers()
getPreferenceScreenResId()
de la página.
Nota: Es posible que la preferencia no tenga un
PreferenceController
Movimiento dinámico en versiones de Android 8.x
- Descubre qué categoría aloja la página original y la de destino. Puedes encontrar
esta información en
DashboardFragmentRegistry
. - Abre el archivo
AndroidManifest.xml
que contiene la configuración que tendrás que moverte y buscar la entrada de la actividad que representa este parámetro de configuración. - Cambia el valor de metadatos de la actividad para
com.android.settings.category
. establece el punto de valor en la clave de categoría de la página nueva.
Cómo crear una nueva preferencia en una página
Si la preferencia se indica estáticamente en el archivo XML de preferencias de la página original sigue el procedimiento estático que se indica a continuación. De lo contrario, sigue las dinámico.
Crea una preferencia estática
- Busca los archivos en formato XML de preferencia para la página. Puedes encontrar esta información a partir del método getPreferenceScreenResId() de la página.
- Agrega un nuevo elemento de Preferencia en el archivo XML. Asegúrate de que tenga un
android:key
único. -
Define un elemento
PreferenceController
para esta preferencia en la seccióngetPreferenceControllers()
.- En Android 8.x y, opcionalmente, en Android 9
crea una instancia de
PreferenceController
para esta preferencia en métodocreatePreferenceControllers()
de la página.Si esta preferencia ya existía en otros lugares, es posible que haya ya es un
PreferenceController
. Puedes reutilizar elPreferenceController
sin crear uno nuevo. -
A partir de Android 9, puedes optar por declarar el
PreferenceController
en XML junto a la preferencia. Por ejemplo:<Preference android:key="reset_dashboard" android:title="@string/reset_dashboard_title" settings:controller="com.android.settings.system.ResetPreferenceController"/>
.
- En Android 8.x y, opcionalmente, en Android 9
crea una instancia de
Cómo crear una preferencia dinámica
- Descubre qué categoría aloja la página original y la de destino. Puedes encontrar
esta información en
DashboardFragmentRegistry
. - Crea una actividad nueva en
AndroidManifest
- Agrega los metadatos necesarios a la actividad nueva para definir la configuración. Establece el
valor de metadatos para
com.android.settings.category
con el mismo valor definidos en el paso 1.
Crear página nueva
- Crea un nuevo fragmento y lo hereda de
DashboardFragment
. - Define su categoría en
DashboardFragmentRegistry
.Nota: Este paso es opcional. Si no necesitas alguna preferencia dinámica de esta página, no es necesario que proporciones una clave de categoría.
- Sigue los pasos para agregar la configuración necesaria para esta página. Para ver más consulta la sección Implementación.
Validación
- Ejecuta las pruebas robóticas en Configuración. Todas las pruebas existentes y nuevas que el pase.
- Compila e instala la configuración y, luego, abre manualmente la página que deseas modificar. La página debería actualizarse de inmediato.