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:
- Definieren Sie eine XML-Datei:
- Für alle Einstellungen muss
android:key
definiert sein. Die Liste der Schlüssel wird inpreference_keys.xml
verwaltet. Die Schlüssel für die Einstellungen müssen eindeutig sein. - Für die Suchindexierung sollten Einstellungsbildschirme auch eine definierte
android:key
haben. Die Liste der Tasten für den Einstellungsbildschirm wird inpreference_screen_keys.xml
verwaltet. Die Schlüssel für den Einstellungsbildschirm sollten ebenfalls eindeutig sein. - 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. - Wenn für die Einstellung Geschäftslogik erforderlich ist, legen Sie einen neuen Namen für den Einstellungscontroller fest.
- Für alle Einstellungen muss
- Bei Bedarf: Erstellen Sie den Einstellungscontroller im entsprechenden Paket, das
PreferenceController
erweitert. Weitere Informationen finden Sie in der Javadoc. - Erstelle ein Fragment mit
getPreferenceScreenResId
, das die in Schritt 1 definierte XML-Datei zurückgibt. - Erstellen Sie in
CarSettingActivities
eine Aktivität, dieBaseCarSettingsActivity
erweitert, und implementieren Sie danngetInitialFragment()
, wobei das in Schritt 3 definierte Fragment zurückgegeben wird. - Aktualisieren Sie
AndroidManifest.xml
, um die in Schritt 4 definierte Aktivität aufzunehmen.
Verwendungsbeispiele
Das folgende Material veranschaulicht diesen Vorgang.
- 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>
- 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>
- 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; } }
- Überschreiben Sie
getPreferenceScreenResId
, um ein Fragment zu erstellen: - Wenn Sie das neue Fragment halten möchten, erstellen Sie eine Aktivität in
CarSettingActivities
: - Aktualisieren Sie die Manifestdatei mit der neuen Aktivität:
- 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.
- Wenn Sie die Aktivität als eingefügte Einstellung kennzeichnen möchten, fügen Sie der Aktivität einen Intent-Filter hinzu.
- 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 inCategoryKey
bereit, aber OEMs sind nicht daran gehindert, eigene Kategorien zu definieren. - 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>
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>
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:
So konfigurieren Sie eine Aktivität als eingefügte Einstellung:
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>