Die meisten Seiten in Car Settings werden als eine Reihe von Fragmenten implementiert, die SettingsFragment
erweitern, wobei jede von ihnen über eine eigene Aktivität verfügt, die in CarSettingActivities
definiert ist. Diese statischen Aktivitäten werden von BaseCarSettingsActivity
erweitert. Zusätzlich zu diesen Einstellungen können Sie Einstellungen von anderen System-Apps einfügen, die in CarSettings angezeigt werden.
Fügen Sie in den Fahrzeugeinstellungen eine neue Einstellung hinzu
So fügen Sie eine neue Einstellung hinzu:
- Definieren Sie eine XML-Datei:
- Stellen Sie sicher, dass in allen Einstellungen
android:key
definiert ist. Die Liste der Schlüssel wird inpreference_keys.xml
verwaltet. Präferenzschlüssel sollten eindeutig sein. - Für Suchindizierungszwecke sollten Einstellungsbildschirme auch über einen definierten
android:key
verfügen. Die Liste der Präferenzbildschirmtasten wird in der Dateipreference_screen_keys.xml
verwaltet. Die Tasten für den Präferenzbildschirm sollten ebenfalls eindeutig sein. - Wenn die Einstellung nur statische Informationen anzeigt (z. B. keine spezielle Geschäftslogik), legen Sie den Einstellungscontroller auf
com.android.car.settings.common.DefaultRestrictionsPreferenceController
fest. - Wenn die Präferenz Geschäftslogik erfordert, legen Sie den Präferenz-Controller mit einem neuen Namen für den Präferenz-Controller fest.
- Stellen Sie sicher, dass in allen Einstellungen
- ( Falls erforderlich ) Erstellen Sie den Präferenzcontroller im entsprechenden Paket, der
PreferenceController
erweitert. Sehen Sie sich bei Bedarf die Javadoc an. - Erstellen Sie 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()
, um das in Schritt 3 definierte Fragment zurückzugeben. - Aktualisieren Sie
AndroidManifest.xml
, um die in Schritt 4 definierte Aktivität einzuschließen.
Beispiel
Das folgende Material veranschaulicht diesen Prozess.
- 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 Präferenzschlü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 Präferenzbildschirmschlüssel zu
preference_screen_keys.xml
hinzu:<resources> [...] <string name="psk_demo" translatable="false">demo_screen</string> </resources>
Verwenden Sie für die erste Beispielpräferenz
DefaultRestrictionsPreferenceController
. Verwenden Sie für die zweite Präferenz einen benutzerdefinierten Präferenz-Controller, der definiert werden muss. In diesem Beispiel können Sie diese Einstellung nur für verfügbare Administratorbenutzer anpassen. Definieren Sie dazu 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; } }
- Um ein Fragment zu erstellen, überschreiben Sie
getPreferenceScreenResId
: - Um das neue Fragment zu speichern, erstellen Sie eine Aktivität in
CarSettingActivities
: - Aktualisieren Sie die Manifestdatei mit der neuen Aktivität:
- Wird nicht direkt in der CarSettings-App implementiert (z. B. durch Einfügen einer von OEMs implementierten Einstellung).
- Sollte in der CarSettings-App erscheinen.
- Um die Aktivität als injizierte Einstellung zu markieren, fügen Sie der Aktivität einen Absichtsfilter hinzu.
- Teilen Sie der CarSettings-App mit, zu welcher Kategorie sie gehört. Die Kategorie ist eine in
CategoryKey
definierte Konstante und wird verwendet, um anzugeben, auf welcher Ebene von CarSettings die eingefügte Einstellung angezeigt werden soll. Wir stellen eine Reihe von Kategorien innerhalbCategoryKey
bereit, es gibt jedoch keine Einschränkungen für OEMs, ihre eigenen Kategorien zu definieren. - ( optional ) Fügen Sie einen zusammenfassenden Text hinzu, 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>
Fügen Sie in den Fahrzeugeinstellungen eine externe Absichtspräferenz hinzu
Als Alternative zu den eingefügten Präferenzen ist es auch möglich, eine Präferenz direkt in die Fahrzeugeinstellungen einzufügen, die in eine andere App übertragen werden soll. Dies kann durch einfaches Hinzufügen einer Präferenz zu einem Präferenzbildschirm mit einer Absichtsaktion erreicht werden, die in eine externe App aufgelöst wird. Wie für andere Einstellungen in den Fahrzeugeinstellungen stehen diesen 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>
Fügen Sie eine injizierte Präferenz hinzu
Injizierte Präferenzen enthalten Absichten, die zu externen oder internen Aktivitäten führen. Beispielsweise ist das Google- Einstellungselement auf der Startseite „Einstellungen“ eine injizierte Einstellung. Injizierte Präferenzen sind besonders nützlich, wenn eine der folgenden Aussagen zutrifft. Die Einstellung:
So konfigurieren Sie eine Aktivität als injizierte Einstellung:
Damit die eingefügte Einstellung auf einer bestimmten Seite in der CarSettings-App angezeigt wird, fügen Sie den folgenden Beispielcode in die XML-Datei ein und ändern Sie gegebenenfalls die Variablen:
<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>