Aggiungi le impostazioni dell'auto

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:

  1. Definire un file XML:
    1. Assicurati che tutte le preferenze abbiano definito android:key . L'elenco delle chiavi viene mantenuto in preference_keys.xml . Le chiavi delle preferenze dovrebbero essere univoche.
    2. 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 in preference_screen_keys.xml . Anche i tasti della schermata delle preferenze dovrebbero essere univoci.
    3. 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 .
    4. Se la preferenza richiede una logica aziendale, impostare il controller delle preferenze con un nuovo nome del controller delle preferenze.
  2. ( Se richiesto ) Creare il controller delle preferenze nel pacchetto appropriato, che estende PreferenceController . Se necessario, vedere Javadoc.
  3. Crea un frammento con getPreferenceScreenResId che restituisce il file XML definito nel passaggio 1.
  4. Crea un'attività in CarSettingActivities che estende BaseCarSettingsActivity e quindi implementa getInitialFragment() , restituendo il frammento definito nel passaggio 3.
  5. Aggiorna AndroidManifest.xml per includere l'attività definita nel passaggio 4.

Esempio

Il materiale seguente illustra questo processo.

  1. 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>
    
  2. 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>
    
  3. 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;
        }
    }
    
  4. Per creare un frammento, sovrascrivi getPreferenceScreenResId :
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
    
  6. Per contenere il nuovo frammento, crea un'attività in CarSettingActivities :
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
    
  8. Aggiorna il file manifest con la nuova attività:
  9. <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:

    • Non è implementato direttamente nell'app CarSettings (come l'inserimento di un'impostazione implementata dagli OEM).
    • Dovrebbe apparire nell'app CarSettings.

    Per configurare un'attività come impostazione inserita:

    1. Per contrassegnare l'attività come impostazione inserita, aggiungi un filtro di intenti all'attività.
    2. 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 di CategoryKey , ma non ci sono restrizioni per gli OEM nella definizione delle proprie categorie.
    3. ( 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>
      

    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>