La maggior parte delle pagine della sezione Impostazioni auto è implementata sotto forma di
che si estendono fino a SettingsFragment
,
ognuno con la propria attività definita in CarSettingActivities
.
Queste attività statiche vengono estese a partire dal giorno BaseCarSettingsActivity
.
Oltre a queste impostazioni, puoi inserire preferenze da altre app di sistema per
in CarSettings.
Aggiungi una nuova preferenza in Impostazioni auto
Per aggiungere una nuova impostazione:
- Definisci un file XML:
- Assicurati che tutte le preferenze abbiano definito
android:key
. Elenco di chiavi viene mantenuto inpreference_keys.xml
. Preferenze le chiavi devono essere univoche. - Ai fini dell'indicizzazione della ricerca, le schermate di preferenza devono includere anche
un valore
android:key
definito. L'elenco dei tasti della schermata delle preferenze è gestito inpreference_screen_keys.xml
. Preferenza anch'essi devono essere univoci. - Se la preferenza mostra solo informazioni statiche (ad esempio,
nessuna logica di business speciale), imposta il controller di preferenze su
com.android.car.settings.common.DefaultRestrictionsPreferenceController
. - Se la preferenza richiede la logica di business, imposta la preferenza con un nuovo nome di controller di preferenze.
- Assicurati che tutte le preferenze abbiano definito
- (Se necessario) Crea il controller di preferenze nel menu
che estende
PreferenceController
. Vedi il Javadoc, se necessario. - Crea un frammento con
getPreferenceScreenResId
che restituisce il valore File XML definito nel passaggio 1. - Crea un'attività in
CarSettingActivities
che si estendeBaseCarSettingsActivity
e poi implementaregetInitialFragment()
, restituendo il frammento definita nel Passaggio 3. - Aggiorna
AndroidManifest.xml
per includere l'attività definita nel passaggio 4.
Esempio
Il seguente materiale illustra questa procedura.
- Definisci un file XML denominato
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>
- Aggiungi i tasti delle preferenze 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>
- Aggiungi il tasto della schermata delle preferenze a
preference_screen_keys.xml
:<resources> [...] <string name="psk_demo" translatable="false">demo_screen</string> </resources>
Per la prima preferenza di esempio, utilizza
DefaultRestrictionsPreferenceController
. Per la seconda preferenza, utilizza un controller di preferenze personalizzato, che deve essere definito. In questo esempio, puoi personalizzare questa preferenza solo per gli utenti amministratori disponibili. Per farlo, definisci il seguente controller personalizzato: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; } }
- Per creare un frammento, sostituisci
getPreferenceScreenResId
: - Per contenere il nuovo frammento, crea un'attività in
CarSettingActivities
: - Aggiorna il file manifest con la nuova attività:
- Non sia implementato direttamente nell'app CarSettings (ad esempio, inserendo un'impostazione implementata dagli OEM).
- Dovrebbe essere visualizzata nell'app CarSettings.
- Per contrassegnare l'attività come impostazione inserita, aggiungi un filtro per intent a l'attività.
- Indica all'app CarSettings a quale categoria appartiene. La categoria è un
costante, definita in
CategoryKey
, e viene utilizzato per indicare a quale livello di CarSettings viene inserita l'impostazione in cui devono essere visualizzati. Forniamo una serie di categorie all'internoCategoryKey
, ma gli OEM non hanno limitazioni da definire le proprie categorie. - (Facoltativo) Aggiungi del testo di riepilogo quando l'impostazione viene visualizzata:
<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>
Aggiungi una preferenza per l'intent esterno nelle Impostazioni dell'auto
In alternativa alle preferenze inserite, è anche possibile inserire una preferenza direttamente in Impostazioni auto che rimanda a un'altra app. A questo scopo, basta aggiungere una preferenza a una schermata di preferenze con un'azione per intent che rimanda a una schermata dell'app. Analogamente ad altre preferenze nelle Impostazioni auto, queste preferenze gli stessi attributi XML disponibili.
<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>
Aggiungi una preferenza inserita
Le preferenze inserite contengono intent che indirizzano a indirizzi esterni o interni attività. Ad esempio, la voce dell'impostazione Google nella sezione la home page è una preferenza inserita. Le preferenze inserite sono particolarmente utile quando una delle seguenti condizioni è vera. L'impostazione:
Per configurare un'attività come impostazione inserita:
Per fare in modo che l'impostazione inserita venga visualizzata in una pagina specifica del CarSettings, includi il seguente codice campione nel file XML, modificando variabili dove appropriato:
<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>