Aggiungi impostazioni auto

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:

  1. Definisci un file XML:
    1. Assicurati che tutte le preferenze abbiano definito android:key. Elenco di chiavi viene mantenuto in preference_keys.xml. Preferenze le chiavi devono essere univoche.
    2. 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 in preference_screen_keys.xml. Preferenza anch'essi devono essere univoci.
    3. 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.
    4. Se la preferenza richiede la logica di business, imposta la preferenza con un nuovo nome di controller di preferenze.
  2. (Se necessario) Crea il controller di preferenze nel menu che estende PreferenceController. Vedi il Javadoc, se necessario.
  3. Crea un frammento con getPreferenceScreenResId che restituisce il valore File XML definito nel passaggio 1.
  4. Crea un'attività in CarSettingActivities che si estende BaseCarSettingsActivity e poi implementare getInitialFragment(), restituendo il frammento definita nel Passaggio 3.
  5. Aggiorna AndroidManifest.xml per includere l'attività definita nel passaggio 4.

Esempio

Il seguente materiale illustra questa procedura.

  1. 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>
    
  2. 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>
    
  3. 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;
        }
    }
    
  4. Per creare un frammento, sostituisci 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 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:

    • Non sia implementato direttamente nell'app CarSettings (ad esempio, inserendo un'impostazione implementata dagli OEM).
    • Dovrebbe essere visualizzata nell'app CarSettings.

    Per configurare un'attività come impostazione inserita:

    1. Per contrassegnare l'attività come impostazione inserita, aggiungi un filtro per intent a l'attività.
    2. 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'interno CategoryKey, ma gli OEM non hanno limitazioni da definire le proprie categorie.
    3. (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>
      

    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>