La mayoría de las páginas de la Configuración del vehículo se implementan como una serie de
Los fragmentos que extienden SettingsFragment
Cada uno de ellos tiene su propia actividad definida en CarSettingActivities
.
Estas actividades estáticas se extienden desde BaseCarSettingsActivity
.
Además de esta configuración, puedes insertar preferencias de otras apps del sistema para
en CarSettings.
Cómo agregar una nueva preferencia en la Configuración del vehículo
Para agregar un nuevo parámetro de configuración, sigue estos pasos:
- Define un archivo en formato XML:
- Asegúrate de que todas las preferencias hayan definido
android:key
. La lista de claves se mantiene enpreference_keys.xml
. Preferencias las claves deben ser únicas. - Para la indexación de búsqueda, las pantallas de preferencia también deben tener
un
android:key
definido. La lista de teclas de pantalla de preferencias se mantiene enpreference_screen_keys.xml
. Preferencia las claves de pantalla también deben ser únicas. - Si la preferencia solo muestra información estática (por ejemplo,
ninguna lógica empresarial especial), establece el controlador de preferencias como
com.android.car.settings.common.DefaultRestrictionsPreferenceController
- Si la preferencia requiere lógica empresarial, configúrala con un nuevo nombre de controlador de preferencias.
- Asegúrate de que todas las preferencias hayan definido
- (Si es necesario) Crea el controlador de preferencias en la
, que extiende
PreferenceController
. Consulta el Javadoc si es necesario. - Crea un fragmento en el que
getPreferenceScreenResId
muestre el XML definido en el paso 1. - Crea una actividad en
CarSettingActivities
que extiendeBaseCarSettingsActivity
Luego, implementasgetInitialFragment()
y muestra el fragmento definidos en el Paso 3. - Actualiza
AndroidManifest.xml
para incluir la actividad definida en el Paso 4.
Ejemplo
En el siguiente material, se ilustra este proceso.
- Define un archivo en formato XML llamado
demo_fragment.xml
:<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/demo_label" android:key="@string/psk_demo"> <Preference android:icon="@drawable/ic_settings_demo_preference_1" android:key="@string/pk_demo_preference_1" android:title="@string/demo_preference_1_title" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting1Activity"/> </Preference> <Preference android:icon="@drawable/ic_settings_demo_preference_2" android:key="@string/pk_demo_preference_2" android:title="@string/demo_preference_2_title" settings:controller="com.android.car.settings.example.MyCustomRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting2Activity"/> </Preference> </PreferenceScreen>
- Agrega las claves de preferencia a
preference_keys
:<resources> [...] <string name="pk_demo_preference_1" translatable="false">demo_preference_1</string> <string name="pk_demo_preference_2" translatable="false">demo_preference_2</string> </resources>
- Agrega la tecla de pantalla de preferencias a
preference_screen_keys.xml
:<resources> [...] <string name="psk_demo" translatable="false">demo_screen</string> </resources>
Para la primera preferencia de ejemplo, usa
DefaultRestrictionsPreferenceController
. Para la segunda preferencia, usa un controlador de preferencias personalizado que debe definirse. En este ejemplo, puedes personalizar esta preferencia para incluir solo los usuarios administradores disponibles. Para hacerlo, define el siguiente controlador personalizado:public class MyCustomRestrictionsPreferenceController extends PreferenceController<Preference> { private final UserManager mUserManager; public MyCustomRestrictionsPreferenceController(Context context, String preferenceKey, FragmentController fragmentController, CarUxRestrictions uxRestrictions) { super(context, preferenceKey, fragmentController, uxRestrictions); mUserManager = UserManager.get(context); } @Override protected Class<Preference> getPreferenceType() { return Preference.class; } @Override public int getAvailabilityStatus() { return mUserManager.isAdminUser() ? AVAILABLE : DISABLED_FOR_USER; } }
- Para crear un fragmento, anula
getPreferenceScreenResId
: - Para contener el nuevo fragmento, crea una actividad en
CarSettingActivities
: - Actualiza el archivo de manifiesto con la nueva actividad:
- No se implementa directamente en la app de CarSettings (como insertar un parámetro de configuración implementado por los OEM).
- Debería aparecer en la app de CarSettings.
- Para marcar la actividad como una configuración insertada, agrega un filtro de intents a la actividad.
- Indícale a la app de CarSettings a qué categoría pertenece. La categoría es una
constante, definida en
CategoryKey
, y se usa para indicar en qué nivel de CarSettings se inserta en la que deberían aparecer. Ofrecemos un conjunto de categoríasCategoryKey
, pero no hay restricciones para que los OEM definan sus propias categorías. - Agrega texto de resumen cuando se muestre el parámetro de configuración (opcional):
<activity android:name="Settings$DemoSettingsActivity" <!-- Mark the activity as an injected setting --> <intent-filter> <action android:name="com.android.settings.action.EXTRA_SETTINGS"/> </intent-filter> <!-- Tell CarSettings app which category it belongs to --> <meta-data android:name="com.android.settings.category" android:value="com.android.settings.category.demo_category"/> <!-- Tell CarSettings the what the preference title should be --> <meta-data android:name="com.android.settings.title" android:value="@string/app_name" /> <!-- Optional: specify the icon to show with the preference --> <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_demo" android:value="true"/> <!-- Optional: Add a summary text when the string is displayed --> <meta-data android:name="com.android.settings.summary" android:resource="@string/demo_summary"/> </activity>
public class DemoFragment extends SettingsFragment { @Override @XmlRes protected int getPreferenceScreenResId() { return R.xml.demo_fragment; } }
public class CarSettingActivities { [...] public static class DemoActivity extends BaseCarSettingsActivity { @Nullable @Override protected Fragment getInitialFragment() { return new DemoFragment(); } } }
<application [...] <activity android:name=".common.CarSettingActivities$DemoActivity" android:exported="true"> <meta-data android:name="distractionOptimized" android:value="true"/> </activity> [...] </application>
Cómo agregar una preferencia de intent externo en la Configuración del vehículo
Como alternativa a las preferencias insertadas, también es posible insertar una preferencia directamente en la Configuración del vehículo que se ejecute otra app. Esto se puede hacer agregando una preferencia a una pantalla de preferencias con una acción de intent que se resuelve en una . Al igual que otras preferencias de la Configuración del vehículo, estas preferencias tener los mismos atributos XML disponibles.
<Preference android:key="@string/pk_demo_preference" android:title="@string/demo_preference_title" android:summary="@string/demo_preference_summary" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:action="android.intent.action.DEMO_ACTION"/> </Preference>
Agrega una preferencia insertada
Las preferencias inyectadas contienen intents que llevan a usuarios de datos. Por ejemplo, el elemento de parámetro de configuración de Google en Configuración la página principal es una preferencia insertada. Las preferencias inyectadas son particularmente útil cuando cualquiera de las siguientes condiciones es verdadera. El parámetro de configuración:
Para configurar una actividad como un parámetro de configuración inyectado, haz lo siguiente:
Para que la configuración insertada aparezca en una página específica en el CarSettings, incluye el siguiente ejemplo de código en el XML, modificando variables cuando corresponda:
<com.android.car.settings.common.LogicalPreferenceGroup <!-- Replace key string --> android:key="@string/pk_system_extra_settings" <!-- Indicates the preferences in the group should be injected in. ExtraSettingsPreferenceController contains the logic to pull in injected preferences. --> settings:controller="com.android.settings.common.ExtraSettingsPreferenceController"> <!-- Tells the controller what activities should be pulled into this preference group. --> <intent android:action="com.android.settings.action.EXTRA_SETTINGS"> <!-- Name and value should match the metadata in your activity --> <extra android:name="com.android.settings.category" android:value="com.android.settings.category.demo_category"/> </intent> </com.android.car.settings.common.LogicalPreferenceGroup>