La maggior parte delle pagine in Car Settings sono implementate come una serie di frammenti che estendono SettingsFragment
, ciascuno dei quali ha la propria attività definita in CarSettingActivities
. Queste attività statiche sono estese da BaseCarSettingsActivity
. Oltre a queste impostazioni, puoi inserire preferenze da altre app di sistema da visualizzare in CarSettings.
Aggiungi una nuova preferenza nelle Impostazioni auto
Per aggiungere una nuova impostazione:
- Definire un file XML:
- Assicurati che tutte le preferenze abbiano definito
android:key
. L'elenco delle chiavi viene mantenuto inpreference_keys.xml
. Le chiavi delle preferenze dovrebbero essere univoche. - Ai fini dell'indicizzazione della ricerca, anche le schermate delle preferenze dovrebbero avere un
android:key
definito. L'elenco dei tasti della schermata delle preferenze viene mantenuto inpreference_screen_keys.xml
. Anche i tasti della schermata delle preferenze dovrebbero essere univoci. - Se la preferenza visualizza solo informazioni statiche (ad esempio, nessuna logica aziendale speciale), imposta il controller delle preferenze come
com.android.car.settings.common.DefaultRestrictionsPreferenceController
. - Se la preferenza richiede una logica aziendale, impostare il controller delle preferenze con un nuovo nome del controller delle preferenze.
- Assicurati che tutte le preferenze abbiano definito
- ( Se richiesto ) Creare il controller delle preferenze nel pacchetto appropriato, che estende
PreferenceController
. Se necessario, vedere Javadoc. - Crea un frammento con
getPreferenceScreenResId
che restituisce il file XML definito nel passaggio 1. - Crea un'attività in
CarSettingActivities
che estendeBaseCarSettingsActivity
e quindi implementagetInitialFragment()
, restituendo il frammento definito nel passaggio 3. - Aggiorna
AndroidManifest.xml
per includere l'attività definita nel passaggio 4.
Esempio
Il materiale seguente illustra questo processo.
- Definire 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 le chiavi di preferenza 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 la chiave 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, utilizzare
DefaultRestrictionsPreferenceController
. Per la seconda preferenza, utilizzare un controller delle preferenze personalizzato, che deve essere definito. Per questo esempio, puoi personalizzare questa preferenza solo per gli utenti amministratori disponibili. A tale scopo, definire 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, sovrascrivi
getPreferenceScreenResId
: - Per contenere il nuovo frammento, crea un'attività in
CarSettingActivities
: - Aggiorna il file manifest con la nuova attività:
- Non è implementato direttamente nell'app CarSettings (come l'inserimento di un'impostazione implementata dagli OEM).
- Dovrebbe apparire nell'app CarSettings.
- Per contrassegnare l'attività come impostazione inserita, aggiungi un filtro di intenti all'attività.
- Di' all'app CarSettings a quale categoria appartiene. La categoria è una costante, definita in
CategoryKey
, e viene utilizzata per indicare a quale livello di CarSettings dovrebbe apparire l'impostazione inserita. Forniamo una serie di categorie all'interno diCategoryKey
, ma non ci sono restrizioni per gli OEM nella definizione delle proprie categorie. - ( opzionale ) Aggiungi testo di riepilogo quando viene visualizzata l'impostazione:
<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 di intento esterno nelle Impostazioni auto
In alternativa alle preferenze inserite, è anche possibile inserire una preferenza direttamente nelle Impostazioni auto che punta ad un'altra app. Questo può essere fatto semplicemente aggiungendo una preferenza a una schermata delle preferenze con un'azione di intento che si risolve in un'app esterna. Come altre preferenze in Impostazioni auto, queste preferenze hanno a disposizione gli stessi attributi XML.
<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 intenti che portano ad attività esterne o interne. Ad esempio, l'elemento di impostazione di Google nella home page Impostazioni è una preferenza inserita. Le preferenze inserite sono particolarmente utili quando si verifica una delle seguenti condizioni. Le impostazioni:
Per configurare un'attività come impostazione inserita:
Per fare in modo che l'impostazione inserita venga visualizzata su una pagina specifica nell'app CarSettings, includi il seguente codice di esempio nell'XML, modificando le variabili ove 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>