Autoeinstellungen hinzufügen

Die meisten Seiten in den Einstellungen für das Auto werden als Reihe von Fragmenten implementiert, die SettingsFragment erweitern. Jedes davon hat eine eigene Aktivität, die in CarSettingActivities definiert ist. Diese statischen Aktivitäten werden von BaseCarSettingsActivity erweitert. Zusätzlich zu diesen Einstellungen können Sie Einstellungen aus anderen System-Apps einfügen, die in den Einstellungen für das Auto angezeigt werden sollen.

Neue Einstellung in den Autoeinstellungen hinzufügen

So fügen Sie eine neue Einstellung hinzu:

  1. Definieren Sie eine XML-Datei:
    1. Für alle Einstellungen muss android:key definiert sein. Die Liste der Schlüssel wird in preference_keys.xml verwaltet. Die Schlüssel für die Einstellungen müssen eindeutig sein.
    2. Für die Suchindexierung sollten Einstellungsbildschirme auch eine definierte android:key haben. Die Liste der Tasten für den Einstellungsbildschirm wird in preference_screen_keys.xml verwaltet. Die Schlüssel für den Einstellungsbildschirm sollten ebenfalls eindeutig sein.
    3. Wenn in der Einstellung nur statische Informationen angezeigt werden (z. B. keine spezielle Geschäftslogik), legen Sie den Einstellungscontroller als com.android.car.settings.common.DefaultRestrictionsPreferenceController fest.
    4. Wenn für die Einstellung Geschäftslogik erforderlich ist, legen Sie einen neuen Namen für den Einstellungscontroller fest.
  2. Bei Bedarf: Erstellen Sie den Einstellungscontroller im entsprechenden Paket, das PreferenceController erweitert. Weitere Informationen finden Sie in der Javadoc.
  3. Erstelle ein Fragment mit getPreferenceScreenResId, das die in Schritt 1 definierte XML-Datei zurückgibt.
  4. Erstellen Sie in CarSettingActivities eine Aktivität, die BaseCarSettingsActivity erweitert, und implementieren Sie dann getInitialFragment(), wobei das in Schritt 3 definierte Fragment zurückgegeben wird.
  5. Aktualisieren Sie AndroidManifest.xml, um die in Schritt 4 definierte Aktivität aufzunehmen.

Verwendungsbeispiele

Das folgende Material veranschaulicht diesen Vorgang.

  1. Definieren Sie eine XML-Datei mit dem Namen 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. Fügen Sie die Einstellungsschlüssel zu preference_keys hinzu:
    <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. Fügen Sie den Schlüssel für den Einstellungsbildschirm zu preference_screen_keys.xml hinzu:
    <resources>
        [...]
        <string name="psk_demo" translatable="false">demo_screen</string>
    </resources>

    Verwenden Sie für die erste Beispieleinstellung DefaultRestrictionsPreferenceController. Verwenden Sie für die zweite Einstellung einen benutzerdefinierten Einstellungscontroller, der definiert werden muss. In diesem Beispiel können Sie diese Einstellung nur für verfügbare Administratoren anpassen. Dazu definieren Sie den folgenden benutzerdefinierten Controller:

    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. Überschreiben Sie getPreferenceScreenResId, um ein Fragment zu erstellen:
  5. public class DemoFragment extends SettingsFragment {
    
        @Override
        @XmlRes
        protected int getPreferenceScreenResId() {
            return R.xml.demo_fragment;
        }
    }
  6. Wenn Sie das neue Fragment halten möchten, erstellen Sie eine Aktivität in CarSettingActivities:
  7. public class CarSettingActivities {
        [...]
        public static class DemoActivity extends BaseCarSettingsActivity {
            @Nullable
            @Override
            protected Fragment getInitialFragment() {
                return new DemoFragment();
            }
        }
    }
  8. Aktualisieren Sie die Manifestdatei mit der neuen Aktivität:
  9. <application
        [...]
        <activity
            android:name=".common.CarSettingActivities$DemoActivity"
            android:exported="true">
            <meta-data android:name="distractionOptimized" android:value="true"/>
        </activity>
        [...]
    </application>

    Einstellung für externe Intents in den Einstellungen für das Auto hinzufügen

    Als Alternative zu den eingefügten Einstellungen können Sie auch eine Einstellung direkt in die Einstellungen für das Auto einfügen, die eine Intent-Aktion zu einer anderen App auslöst. Dazu fügen Sie einfach einem Einstellungsbildschirm eine Einstellung mit einer Intent-Aktion hinzu, die auf eine externe App verweist. Wie bei anderen Einstellungen in den Einstellungen für das Auto stehen für diese Einstellungen dieselben XML-Attribute zur Verfügung.

    <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>

    Eingebettete Einstellung hinzufügen

    Eingeschleuste Einstellungen enthalten Intents, die zu externen oder internen Aktivitäten führen. Ein Beispiel für eine solche Einstellung ist der Eintrag Google auf der Startseite der Einstellungen. Eingebettete Einstellungen sind besonders nützlich, wenn Folgendes zutrifft: Die Einstellung:

    • Sie sind nicht direkt in der CarSettings App implementiert (z. B. Einschleusen einer Einstellung, die von OEMs implementiert wurde).
    • Sollte in der CarSettings App angezeigt werden.

    So konfigurieren Sie eine Aktivität als eingefügte Einstellung:

    1. Wenn Sie die Aktivität als eingefügte Einstellung kennzeichnen möchten, fügen Sie der Aktivität einen Intent-Filter hinzu.
    2. Teilen Sie der CarSettings App mit, zu welcher Kategorie sie gehört. Die Kategorie ist eine Konstante, die in CategoryKey definiert ist. Sie gibt an, auf welcher Ebene von „CarSettings“ die eingeblendete Einstellung angezeigt werden soll. Wir stellen eine Reihe von Kategorien in CategoryKey bereit, aber OEMs sind nicht daran gehindert, eigene Kategorien zu definieren.
    3. Optional: Fügen Sie einen zusammenfassenden Text hinzu, der angezeigt wird, wenn die Einstellung angezeigt wird:
      <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>

    Wenn die eingeblendete Einstellung auf einer bestimmten Seite in der CarSettings App angezeigt werden soll, fügen Sie den folgenden Beispielcode in die XML-Datei ein und ändern Sie die Variablen gegebenenfalls:

    <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>