Systemleisten anpassen

Wenn Sie Systemleisten anpassen möchten, verwenden Sie eine Kombination aus XML-Konfigurationen und Dagger-Modulen für die UI-Komponenten.

Verhalten der Systemleiste definieren

Verwenden Sie das <SystemBar>-Tag in einer XML-Datei, um eine Systemleiste zu definieren. Damit legen Sie das Erscheinungsbild und die Animation fest. Diese XML-Datei ist Teil eines RRO (Runtime Resource Overlay).

SystemBar-Tag-Attribute

Das Stammelement für eine Systemleistenkonfiguration ist <SystemBar>. Es unterstützt die folgenden Attribute:

Attribut Status Beschreibung
id Erforderlich Eindeutige Ressourcen-ID für die Systemleiste. Beispiel: @id/my_custom_status_bar
type Erforderlich Gibt den Typ der Systemleiste an, der entweder status oder navigation ist.
barZOrder Erforderlich

Ganzzahl, die die Z-Reihenfolge der Systemleiste darstellt. Höhere Werte bedeuten, dass der Balken über anderen gezeichnet wird. Muss eine positive Ganzzahl sein. Es gelten die folgenden Regeln:

  • Wenn Sie eine Systemleiste über einer Kurzmitteilung anzeigen, muss dieser Wert größer als 10 sein.
  • Überlappende Systemleisten dürfen nicht denselben Z-Index haben
defaultVariant Erforderlich ID des <Variant>, das standardmäßig angewendet wird, wenn die Systemleiste initialisiert wird
displayId Optional ID des <Variant>, das standardmäßig angewendet wird, wenn die Systemleiste initialisiert wird
hideForKeyboard Optional

Boolescher Wert von true oder false, der angibt, ob die Systemleiste automatisch ausgeblendet wird, wenn die Softwaretastatur aktiv ist. Der Standardwert dieses Attributs ist false.

Wenn dieses Attribut true ist, müssen Sie _System_Show_Panel- und _System_Hide_Panel-Übergänge für die Systemleiste angeben.

dragOpenNotification Optional

Boolescher Wert von true oder false, der angibt, ob die Systemleiste automatisch das Öffnen des Benachrichtigungsbereichs auslöst. Der Standardwert dieses Attributs ist false.

dragCloseNotification Optional

Boolescher Wert von true oder false, der angibt, ob die Systemleiste das Schließen des Benachrichtigungsbereichs automatisch auslöst. Der Standardwert dieses Attributs ist false.

Systemleisten-IDs und ‑Typen

Vermeiden Sie die Verwendung von TopCarSystemBar, BottomCarSystemBar, LeftCarSystemBar und RightCarSystemBar als id-Werte. Das System reserviert diese IDs für die Abwärtskompatibilität. Ihre Verwendung kann zu unerwartetem Verhalten führen.

Verwenden Sie für grundlegende Konfigurationen der oberen Statusleiste und der unteren Navigationsleiste status bzw. nav als Attributwerte für type.

Wenn Sie diese IDs verwenden, können Sie den Abschnitt Systemleisten-UI mit Dagger bereitstellen überspringen.

<Variant>
Definiert visuelle Zustände. Weitere Informationen Definieren Sie im <SystemBar>-Tag ein oder mehrere <Variant>-Tags. Jede Variante stellt einen bestimmten visuellen Status dar und enthält Eigenschaften, die das Erscheinungsbild der Systemleiste in diesem Status steuern.
<Visibility isVisible="true|false">
Steuert die Sichtbarkeit der Systemleiste. Der boolesche Wert isVisible gibt an, ob die Systemleiste sichtbar ist oder nicht.
<Alpha alpha="float_value">
Steuert die Transparenz der Systemleiste. Der Wert für alpha liegt zwischen 0.0 (vollständig transparent) und 1.0 (vollständig undurchsichtig).
<Bounds .../>

Definiert die Position und Größe der Systemleiste. Bei <SystemBar>-Elementen muss mindestens eine Begrenzung den Displayrand berühren (links, oben, rechts oder unten). Attribute:

  • left, top, right, bottom: Absolute Koordinaten.
  • width, height: Dimensionen.
  • leftOffset, topOffset, rightOffset, bottomOffset: Offsets in Richtung der Mitte des Rechtecks.
<Corner radius="dimen"/>

Definiert den Eckenradius der Systemleiste. Geben Sie für radius die Abmessung des Eckenradius ein.

<Insets .../>

Definiert Insets für die Systemleiste. Die Attribute sind left, top, right und bottom. Geben Sie für jedes Attribut einen Dimensionswert für die Insets ein.

<Gravity .../>

Definiert die Ausrichtung des Inhalts der Systemleiste. Weitere Informationen finden Sie unter HunTagXmlParserKt.GRAVITY_TAG im Quellcode.

  • Wenn Sie keinen Wert für die Schwerkraft angeben, wird er vom System intern berechnet.
  • Unterstützte Werte sind Kombinationen aus TOP, BOTTOM, LEFT, RIGHT, CENTER, CENTER_HORIZONTAL, CENTER_VERTICAL und FILL_HORIZONTAL, die jeweils durch ein |-Zeichen getrennt sind.

Einheiten für Dimensionen

Geben Sie Dimensionen mit px, dp (oder dip), % oder Verweisen auf dimension-, integer-, fraction-, string- oder attribute-Ressourcen an.

Übergänge: Animationen zwischen Varianten

Weitere Informationen finden Sie unter Übergang konfigurieren. Mit dem <Transitions>-Block können Sie festlegen, wie die Systemleiste zwischen verschiedenen Varianten animiert wird:

Element Tag-Attribut
<Transition> fromVariant, toVariant, onEvent, onEventTokens, animator, duration, delay, interpolator
<Transitions> defaultDuration, defaultInterpolator

Die skalierbare Benutzeroberfläche unterstützt Übergänge in Systemleisten nur, wenn Sie sie für Anwendungsfälle im nicht immersiven Modus definieren. Das bedeutet, dass der Immersive-Modus keine skalierbaren UI-Fensterübergänge für Systemleisten auslöst, wenn eine Systemleiste ausgeblendet oder eingeblendet wird.

Scalable UI sendet weiterhin Ereignisse zum Ausblenden (oder Einblenden) einer Systemleiste, damit andere Bereiche nach Bedarf reagieren können. Übergänge zum Ausblenden und Einblenden von Systemleisten müssen für die ordnungsgemäße Funktion des Attributs hideForKeyboard bereitgestellt werden. Hier ein Beispiel für eine XML-Struktur:

<SystemBar id="@id/my_custom_status_bar" type="status" barZOrder="0" defaultVariant="@id/default_variant" hideForKeyboard="true">
    <Variant id="@+id/default_variant">
        <Bounds top="0px" left="0px" right="100%" height="100px"/>
        <Visibility isVisible="true"/>
    </Variant>
    <Variant id="@+id/hidden_variant" parent="@id/default_variant">
        <Visibility isVisible="false"/>
    </Variant>
    <Transitions>
        <Transition onEvent="_System_Show_Panel" onEventTokens="panelId= my_custom_status_bar" toVariant="@id/default_variant"/>
        <Transition onEvent="_System_Hide_Panel" onEventTokens="panelId= my_custom_status_bar" toVariant="@id/hidden_variant"/>
    </Transitions>
</SystemBar>

Systemleisten-UI mit Dagger bereitstellen

Nachdem Sie die Systemleiste in XML definiert haben, geben Sie die tatsächlichen View und Window an. Wenden Sie dazu eine Anwendungsüberschreibung auf das Standard-Dagger-Modul CarSystemBarModule.java an. Beispiel:

import com.android.systemui.car.systembar.CarSystemBarViewSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplierUsingLayout;
import com.example.R;

import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;

@Module
public abstract class MySystemBarModule extends CarSystemBarModule {

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarViewSupplier bindMyCustomStatusBarViewSupplier() {
        return new CarSystemBarViewSupplierUsingLayout(
            R.layout.my_custom_status_bar, // provisioned layout
            R.layout.my_custom_status_bar_unprovisioned // unprovisioned layout
        );
    }

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarWindowSupplier bindMyCustomStatusBarWindowSupplier() {
        return new CarSystemBarWindowSupplierUsingLayout(
            R.layout.my_navigation_bar_window, // Can reuse existing window layouts
            R.id.my_custom_bar_window // The ID that will be assigned to the window
        );
    }
}

Dagger-Modul in einem SystemUI-Override erstellen

Verwenden Sie die Klassen CarSystemBarViewSupplierUsingLayout und CarSystemBarWindowSupplierUsingLayout, um Ihre benutzerdefinierten Layoutressourcen zu instanziieren.

Erstellen Sie ein Dagger-Modul, um Ihre benutzerdefinierten Anbieter bereitzustellen. Die @StringKey muss mit der id in Ihrem <SystemBar>-XML-Tag übereinstimmen.

Wenn Sie CarSystemBarModule überschreiben möchten, sehen Sie sich dieses Codebeispiel an:

import com.android.systemui.car.systembar.CarSystemBarViewSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplierUsingLayout;
import com.example.R;

import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;

@Module
public abstract class MySystemBarModule extends CarSystemBarModule {

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarViewSupplier bindMyCustomStatusBarViewSupplier() {
        return new CarSystemBarViewSupplierUsingLayout(
            R.layout.my_custom_status_bar, // provisioned layout
            R.layout.my_custom_status_bar_unprovisioned // unprovisioned layout
        );
    }

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarWindowSupplier bindMyCustomStatusBarWindowSupplier() {
        return new CarSystemBarWindowSupplierUsingLayout(
            R.layout.my_navigation_bar_window, // Can reuse existing window layouts
            R.id.my_custom_bar_window // The ID that will be assigned to the window
        );
    }
}

Mit einem RRO eine Konfiguration auf Systemebene erstellen

Legen Sie in der Datei res/values/config.xml in Ihrem RRO mehrere Konfigurationen auf Systemebene fest, die sich auf Systemleisten auswirken.

Alte Systemleisten deaktivieren

Um Konflikte mit der skalierbaren Benutzeroberfläche zu vermeiden, deaktivieren Sie die Legacy-Konfigurationen der Systemleiste, indem Sie die folgenden Flags auf false setzen:

<resources>
    <bool name="config_enableTopSystemBar">false</bool>
    <bool name="config_enableBottomSystemBar">false</bool>
    <bool name="config_enableLeftSystemBar">false</bool>
    <bool name="config_enableRightSystemBar">false</bool>
</resources>

Position des Datenschutzindikators

Die String-Ressource config_privacyIndicatorLocation gibt an, in welcher Systemleiste Datenschutzindikatoren gehostet werden. Der Wert muss der id-Name einer <SystemBar> sein.

<resources>
    <!-- "my_custom_status_bar" corresponds to the android:id name of a SystemBar -->
    <string name="config_privacyIndicatorLocation">my_custom_status_bar</string>
</resources>

Drag-Event-Listener

Mit diesen Konfigurationen wird angegeben, welche Systemleisten auf Zieh-Ereignisse reagieren (z. B. zum Herunterwischen, um das Benachrichtigungsfeld zu öffnen). In Android Automotive OS mit Scalable UI werden XML-Attribute standardmäßig anstelle von ressourcenbasierten Arrays verwendet, um diese Funktionen zu definieren.

Empfohlen: XML-basierte Erkennung (skalierbare Benutzeroberfläche)

Verwenden Sie die Attribute dragOpenNotification und dragCloseNotification direkt in Ihrem <SystemBar>-Tag im Overlay-XML:

<SystemBar id="@id/my_custom_status_bar" type="status" barZOrder="0" defaultVariant="@id/default_variant" dragOpenNotification="true">
    <Variant id="@+id/default_variant">
        <Bounds top="0px" left="0px" right="100%" height="100px"/>
        <Visibility isVisible="true"/>
    </Variant>
</SystemBar>

Legacy: Ressourcen-Array (Fallback)

Wenn Sie einen Build mit nicht skalierbarer Benutzeroberfläche verwalten oder Listener für abwärtskompatible Geräte angeben müssen, verwenden Sie den alten string-array-Ansatz in res/values/config.xml in Ihrem RRO. Mit diesen string-array-Ressourcen wird angegeben, für welche Systemleisten Drag-Ereignisse erfasst werden. Zum Beispiel zum Öffnen der Benachrichtigungsleiste. Jedes <item> ist der id-Name einer Systemleiste.

  • config_registerHvacDragCloseListener
  • config_notificationDragOpenListener
  • config_notificationDragCloseListener

Beispiel:

<resources>
    <string-array name="config_notificationDragOpenListener" translatable="false">
        <item>my_custom_status_bar</item>
    </string-array>
</resources>

Erstellen und bereitstellen

So erstellen und stellen Sie eine Statusleiste bereit:

  1. Flashen Sie das Gerät mit Ihrer geänderten SystemUI-Überschreibungsanwendung.

  2. Verwenden Sie das Android-Build-System (m), um Ihr RRO-Projekt zu kompilieren.

  3. Stellen Sie das generierte RRO-APK auf Ihrem Android Automotive-Gerät bereit. Verwende adb install oder flashe einen vollständigen Build, der dein RRO enthält.