Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Arquitectura informacional

Android 8.0 introdujo una nueva arquitectura de información para la aplicación Configuración para simplificar la forma en que se organizan las configuraciones y hacer que sea más fácil para los usuarios encontrar configuraciones rápidamente para personalizar sus dispositivos Android. Android 9 introdujo algunas mejoras para proporcionar más funciones de configuración y una implementación más sencilla.

Ejemplos y fuente

La mayoría de las páginas de Configuración se implementan actualmente con el nuevo marco. Un ejemplo es buena DisplaySettings: packages/apps/Settings/src/com/android/settings/DisplaySettings.java

Las rutas de archivos para componentes importantes se enumeran a continuación:

  • CategoryKey: 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 (introducido en Android 9): packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java

Implementación

Se anima a los fabricantes de dispositivos a adaptar la arquitectura de información de configuración existente e insertar páginas de configuración adicionales según sea necesario para adaptarse a las funciones específicas de los socios. Moviendo las preferencias de la página legado (implementados como SettingsPreferencePage ) a una nueva página (implementado usando DashboardFragment ) puede ser complicado. La preferencia de la página legado probable es que no se implementa con un PreferenceController .

Así que cuando se mueve a una página de preferencias de legado a una nueva página, es necesario crear un PreferenceController y mover el código en el controlador antes de crear instancias en el nuevo DashboardFragment . Las APIs que PreferenceController requiere se describen en su nombre y documentados en Javadoc.

Es muy recomendable añadir una prueba unitaria para cada PreferenceController . Si el cambio se envía a AOSP, se requiere una prueba unitaria. Para obtener más información sobre cómo escribir pruebas basadas Robolectric, consulte el archivo README packages/apps/Settings/tests/robotests/README.md .

Arquitectura de información de estilo plugin

Cada elemento de configuración se implementa como una preferencia. Una preferencia se puede mover fácilmente de una página a otra.

Para facilitar el movimiento de múltiples configuraciones, Android 8.0 introdujo un fragmento de host de estilo plugin que contiene elementos de configuración. Los elementos de configuración se modelan como controladores de estilo plugin. Por lo tanto, una página de configuración se construye con un solo fragmento de host y varios controladores de configuración.

DashboardFragment

DashboardFragment es el anfitrión de controladores de preferencias de estilo plugin. Los hereda de fragmentos de PreferenceFragment y tiene ganchos para expandir y actualizar ambas listas de preferencias estáticas y listas de preferencias dinámicas.

Preferencias estáticas

Una lista de preferencia estática se define en XML usando el <Preference> tag. Un DashboardFragment aplicación utiliza la getPreferenceScreenResId() método para definir qué archivo XML contiene la lista estática de las preferencias para mostrar.

Preferencias dinámicas

Un elemento dinámico representa un mosaico con intención, que conduce a una actividad externa o interna. Por lo general, la intención conduce a una página de configuración diferente. Por ejemplo, el elemento de configuración "Google" en la página de inicio de Configuración es un elemento dinámico. Artículos dinámicos se definen en AndroidManifest (discutido más adelante) y se cargan a través de un FeatureProvider (definido como DashboardFeatureProvider ).

Las configuraciones dinámicas son más pesadas que las configuraciones configuradas estáticamente, por lo que normalmente los desarrolladores deben implementar la configuración como estática. Sin embargo, la configuración dinámica puede ser útil cuando se cumple alguna de las siguientes condiciones:

  • La configuración no se implementa directamente en la aplicación Configuración (como inyectar una configuración implementada por las aplicaciones OEM / Carrier).
  • La configuración debería aparecer en la página de inicio de Configuración.
  • Ya tiene una actividad para la configuración y no desea implementar la configuración estática adicional.

Para configurar una actividad como una configuración dinámica, haga lo siguiente:

  • Marque la actividad como una configuración dinámica agregando un filtro de intención a la actividad.
  • Dile a la aplicación Configuración a qué categoría pertenece. La categoría es una constante, que se define en CategoryKey .
  • Opcional: agregue texto de resumen cuando se muestre la configuración.

He aquí un ejemplo tomado de la aplicación Ajustes para 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 tiempo de render, el fragmento le pedirá una lista de Preferencias en tanto XML estáticos y dinámicos ajustes definidos en AndroidManifest . Si los PreferenceController s se definen en código Java o en XML, DashboardFragment gestiona la lógica de manejo de cada ajuste a través PreferenceController (véase más adelante). Luego, se muestran en la interfaz de usuario como una lista mixta.

PreferenceController

Existen diferencias entre la aplicación de PreferenceController en Android y Android 9 8.x, tal 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 la preferencia, incluyendo visualización, la actualización, la indexación de búsqueda, etc.

La interfaz de PreferenceController se define como BasePreferenceController . Por ejemplo, véase el código en packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java

Hay varias subclases de BasePreferenceController , cada asignación a un estilo de interfaz de usuario específica que la configuración de aplicación soporta por defecto. Por ejemplo, TogglePreferenceController tiene una API que corresponde directamente a la forma en que el usuario debe interactuar con una interfaz de usuario basada en la preferencia de palanca.

BasePreferenceController tiene APIs como getAvailabilityStatus() , displayPreference() , handlePreferenceTreeClicked(), etc. La documentación detallada para cada API se encuentra en la clase de interfaz.

Una restricción a la implementación de BasePreferenceController (y sus subclases, tales como TogglePreferenceController ) es que la firma constructora debe coincidir con uno de los siguientes:

  • public MyController(Context context, String key) {}
  • public MyController(Context context) {}

Durante la instalación de una preferencia para el fragmento, tablero de instrumentos proporciona un método para unir un PreferenceController antes de tiempo de visualización. En el momento de la instalación, el controlador está conectado al fragmento para que todos los eventos relevantes futuros se envíen al controlador.

DashboardFragment mantiene una lista de PreferenceController s en la pantalla. En el fragmento onCreate() , todos los controladores son invocados para la getAvailabilityStatus() método, y si se devuelve verdadero, displayPreference() se invoca para la lógica de visualización de procesos. getAvailabilityStatus() también es importante decirle al marco de configuración, que los artículos están disponibles durante la búsqueda.

PreferenceController en versiones de Android 8.x

Un PreferenceController contiene toda la lógica para interactuar con la preferencia, incluyendo visualización, la actualización, la indexación de búsqueda. etc.

En correspondencia con las interacciones de preferencia, la interfaz de PreferenceController tiene APIs isAvailable() , displayPreference() , handlePreferenceTreeClicked() etc. documentación detallada sobre cada API se puede encontrar en la clase de interfaz.

Durante la instalación de una preferencia para el fragmento, tablero de instrumentos proporciona un método para unir un PreferenceController antes de tiempo de visualización. En el momento de la instalación, el controlador está conectado al fragmento para que todos los eventos relevantes futuros se envíen al controlador.

DashboardFragment mantiene una lista de PreferenceControllers en la pantalla. En el fragmento onCreate() , todos los controladores son invocados para la isAvailable() método, y si se devuelve verdadero, displayPreference() se invoca para la lógica de visualización de procesos.

Usando DashboardFragment

Mover una preferencia de la página A a la B

Si la preferencia aparece de forma estática en el archivo XML preferencia de la página original, siga el procedimiento movimiento estático para su liberación Android a continuación. De lo contrario, siga el procedimiento movimiento dinámico de su versión de Android.

Movimiento estático en Android 9

  1. Busque los archivos XML de preferencias para la página original y la página de destino. Usted puede encontrar esta información a partir de la página getPreferenceScreenResId() método.
  2. Elimina la preferencia del XML de la página original.
  3. Agregue la preferencia al XML de la página de destino.
  4. Retire la PreferenceController de esta preferencia de la aplicación Java de la página original. Por lo general, se encuentra en createPreferenceControllers() . El controlador puede declararse directamente en XML.

    Nota: La preferencia puede no tener un PreferenceController .

  5. Una instancia del PreferenceController en la página de destino createPreferenceControllers() . Si el PreferenceController se define en XML en la página antigua, definirlo en XML para la nueva página también.

Movimiento dinámico en Android 9

  1. Busque la categoría que aloja la página original y la de destino. Puede encontrar esta información en DashboardFragmentRegistry .
  2. Abra la AndroidManifest.xml archivo que contiene la configuración que necesita para moverse y encontrar la entrada de la actividad que representa esta configuración.
  3. Ajuste del valor de los metadatos de la actividad para com.android.settings.category a las categorías principales de la nueva página.

Movimiento estático en las versiones de Android 8.x

  1. Busque los archivos XML de preferencias para la página original y la página de destino.
  2. Usted puede encontrar esta información a partir de la página getPreferenceScreenResId() método.
  3. Elimina la preferencia en el XML de la página original.
  4. Agregue la preferencia al XML de la página de destino.
  5. Retire la PreferenceController de esta preferencia en la aplicación Java de la página original. Por lo general es en getPreferenceControllers() .
  6. Nota: Es posible la preferencia no tiene un PreferenceController .

  7. Una instancia del PreferenceController en la página de destino getPreferenceControllers() .

Movimiento dinámico en versiones de Android 8.x

  1. Busque la categoría que aloja la página original y la de destino. Puede encontrar esta información en DashboardFragmentRegistry .
  2. Abra la AndroidManifest.xml archivo que contiene la configuración que necesita para moverse y encontrar la entrada de la actividad que representa esta configuración.
  3. Cambiar valor de metadatos de la actividad para la com.android.settings.category , establecer el punto de valor a las categorías principales de la nueva página.

Crear una nueva preferencia en una página

Si la preferencia aparece de forma estática en el archivo XML preferencia de la página original, siga el procedimiento estático a continuación. De lo contrario, siga el procedimiento dinámico.

Creando una preferencia estática

  1. Busque los archivos XML de preferencias para la página. Puede encontrar esta información en el método getPreferenceScreenResId () de la página.
  2. Agregue un nuevo elemento de preferencia en el XML. Asegúrese de que tiene un único android:key .
  3. Definir un PreferenceController de esta preferencia en la página de getPreferenceControllers() método.
    • En 8.x Android y opcionalmente en Android 9, una instancia de un PreferenceController para esta preferencia en de la página createPreferenceControllers() método.

      Si esta preferencia ya existía en otros lugares, es posible que ya existe un PreferenceController por ello. Puede volver a utilizar el PreferenceController sin necesidad de construir una nueva.

    • A partir de Android 9, se puede optar por declarar la 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"/>
      

Creando una preferencia dinámica

  1. Busque la categoría que aloja la página original y la de destino. Puede encontrar esta información en DashboardFragmentRegistry .
  2. Crear una nueva actividad en AndroidManifest
  3. Agregue los metadatos necesarios a la nueva actividad para definir la configuración. Establecer el valor de metadatos para com.android.settings.category al mismo valor definido en el paso 1.

Crea una nueva pagina

  1. Crear un nuevo fragmento, heredando de DashboardFragment .
  2. Definir su categoría en DashboardFragmentRegistry .

    Nota: Este paso es opcional. Si no necesita preferencias dinámicas en esta página, no es necesario que proporcione una clave de categoría.

  3. Siga los pasos para agregar la configuración necesaria para esta página. Para obtener más información, consulte la Implementación sección.

Validación

  • Ejecute las pruebas roboeléctricas en Configuración. Todas las pruebas nuevas y existentes deben aprobarse.
  • Genere e instale Configuración, luego abra manualmente la página que se está modificando. La página debería actualizarse de inmediato.