Codelab zu SystemUIOverlayWindow

Auf dieser Seite wird erläutert, wie Sie eine Ansicht in der SystemUIOverlayWindow erstellen.

Vorbereitung

Die folgenden Informationen setzen voraus, dass Sie die folgenden Artikel zur Systemoberfläche gelesen haben:

In diesem Artikel:

  • Es wird davon ausgegangen, dass Sie mit Anwendungsfällen für Android Automotive OS und seinen SystemUIOverlayWindow vertraut sind.
  • Hier finden Sie Beispiele für bestimmte Unterklassen der OverlayViewController.
  • Es werden keine Unterklassen der OverlayViewController adressiert.
  • Es wird nicht erklärt, wie Android für die Entwicklung eingerichtet wird.
  • Es werden nicht alle Optionen beschrieben, die in Basisklassen überschrieben werden können. Es werden nur die Optionen beschrieben, die zum Einrichten einer einfachen Ansicht erforderlich sind.

Codelab abschließen

Schritt 1: Layout für den OverlayViewController erstellen

Erstellen Sie eine Datei mit dem Namen frameworks/base/packages/CarSystemUI/res/layout/codelab_layout.xml, die Folgendes enthält:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/codelab_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="Code Lab View!"
            android:color="@*android:color/car_accent"
            android:textStyle="italic"
            android:textSize="34sp"/>
        <Button
            android:id="@+id/codelab_button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:text="Hide!"
            android:background="@*android:color/car_accent"/>
    </LinearLayout>
</FrameLayout>

Mit diesem Layout wird die folgende Ansicht erstellt:

OverlayViewController
Abbildung 1 OverlayViewController

Schritt 2: SysUIOverlayWindow ein ViewStub hinzufügen

Fügen Sie die Ansicht dem Fenster hinzu, indem Sie der SystemUIOverlayWindow einen ViewStub hinzufügen.

Fügen Sie den folgenden Code zu frameworks/base/packages/CarSystemUI/res/layout/sysui_overlay_window.xml im Stammverzeichnis FrameLayout hinzu:

<ViewStub android:id="@+id/codelab_stub"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout="@layout/codelab_layout"/>

Die Reihenfolge, in der ViewStubs im Stammelement FrameLayout definiert sind, bestimmt die Z-Reihenfolge der Ansichten im Fenster. Da in diesem Codelab keine Ansichten übereinander gelegt werden, können Sie das Code-Snippet überall im Stammverzeichnis FrameLayout einfügen.

Schritt 3: OverlayViewController erstellen

Damit das neue Layout angezeigt und ausgeblendet werden kann, muss es mit einem OverlayViewController verknüpft sein.

So erstellen Sie eine injizierbare OverlayViewController mit dem Namen frameworks/base/packages/CarSystemUI/src/com/android/systemui/car/codelab/CodeLabViewController.java und dem folgenden Inhalt:

package com.android.systemui.car.codelab;

import com.android.systemui.R;
import com.android.systemui.car.window.OverlayViewController;
import com.android.systemui.car.window.OverlayViewGlobalStateController;
import com.android.systemui.dagger.SysUISingleton;

import javax.inject.Singleton;

@SysUISingleton
public class CodeLabViewController extends OverlayViewController {

    @Inject
    public CodeLabViewController(
            OverlayViewGlobalStateController overlayViewGlobalStateController) {
        super(R.id.codelab_stub, overlayViewGlobalStateController);
    }
}

Schritt 4: OverlayViewMediator erstellen

Es ist ein OverlayViewMediator erforderlich, der ausgelöst wird, wenn eine neue Ansicht angezeigt oder ausgeblendet wird.

Erstellen Sie eine neue injizierbare OverlayViewMediator mit dem Namen frameworks/base/packages/CarSystemUI/src/com/android/systemui/car/codelab/CodeLabViewMediator.java und folgendem Inhalt:
package com.android.systemui.car.codelab;

import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter;
import com.android.systemui.car.window.OverlayViewMediator; import com.android.systemui.dagger.SysUISingleton;
import javax.inject.Inject;
@SysUISingleton public class CodeLabViewMediator implements OverlayViewMediator { Context mContext; CodeLabViewController mCodeLabViewController;
@Inject public CodeLabViewMediator(Context context, CodeLabViewController codeLabViewController) { mContext = context; mCodeLabViewController = codeLabViewController; }
@Override public void registerListeners() { // no-op }
@Override public void setupOverlayContentViewControllers() { // no-op } }

Schritt 5: Ansicht anzeigen

Verwenden Sie Bluetooth, wenn der Status deaktiviert ist, um die Ansicht zu aktivieren.

Ersetzen Sie // no-op in CodeLabViewMediator#registerListeners durch Folgendes:

// Register Show Listener
mContext.registerReceiver(new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();

if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); switch (state) { case BluetoothAdapter.STATE_OFF: // Show OverlayViewController mCodeLabViewController.start(); break; } } } }, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));

Schritt 6: Ansicht ausblenden

Die Ansicht wird ausgeblendet, wenn auf die Schaltfläche „Ausblenden“ geklickt wird. Da diese Aktion nur auf der Schaltfläche der maximierten Ansicht verfügbar ist, fügen Sie sie direkt zu OverlayViewController hinzu.

Fügen Sie CodeLabViewController die folgende Methode hinzu:

@Override
protected void onFinishInflate() {
    getLayout().findViewById(R.id.codelab_button).setOnClickListener(v -> {
        stop();
    });
}

Schritt 7: Neuen OverlayViewMediator konfigurieren

  1. Wenn Sie dem OverlayWindowModule den neuen OverlayViewMediator hinzufügen möchten, fügen Sie OverlayWindowModule den folgenden Code hinzu:
    /** Injects CodeLabViewMediator. */
    @Binds
    @IntoMap
    @ClassKey(CodeLabViewMediator.class)
    public abstract OverlayViewMediator bindCodeLabViewMediator(
            CodeLabViewMediator overlayViewsMediator);
  2. Wenn Sie den neuen OverlayViewMediator zu config_carSystemUIOverlayViewsMediators hinzufügen möchten, fügen Sie in frameworks/base/packages/CarSystemUI/res/values/config.xml die folgende Zeile zu config_carSystemUIOverlayViewsMediators hinzu:
    <item>com.android.systemui.car.codelab.CodeLabViewMediator</item>

Ergebnis

Glückwunsch! Sie haben eine Ansicht in SystemUIOverlayWindow erstellt:

SystemUIOverlayWindow
Abbildung 2. SystemUIOverlayWindow

Weitere Informationen

Weitere Informationen finden Sie in den folgenden Ressourcen.

Beispiel für OverlayViewController

Der Vollbild-Nutzerwechsel ist eine einfache Anwendung von SystemUIOverlayWindow::

Andere OverlayViewControllers

OverlayPanelViewController

Ein OverlayPanelViewController wird verwendet, um eine einfache Ziehanimation bereitzustellen, wenn Ansichten in SystemUIOverlayWindow angezeigt und ausgeblendet werden. Weitere Informationen finden Sie im Benachrichtigungsbereich: