Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

SystemUIOverlayWindow Codelab

Bài viết này giải thích cách tạo một dạng xem trong SystemUIOverlayWindow .

Trước khi bạn bắt đầu

Nội dung được cung cấp bên dưới giả sử bạn đã đọc các bài viết này về Giao diện người dùng hệ thống:

Bài viết này:

  • Giả sử bạn đã quen thuộc với các trường hợp sử dụng cho Hệ điều hành ô tô Android và SystemUIOverlayWindow của nó.
  • Cung cấp các ví dụ về các lớp con nhất định của OverlayViewController .
  • Không giải quyết các lớp con của OverlayViewController .
  • Không giải thích cách thiết lập Android để phát triển.
  • Không mô tả từng tùy chọn có thể được ghi đè trong các lớp cơ sở. Thay vào đó, nó chỉ mô tả những thứ cần thiết để thiết lập một khung nhìn cơ bản.

Hoàn thành bảng mã

Bước 1: Tạo bố cục cho OverlayViewController

Tạo một tệp có tên là frameworks/base/packages/CarSystemUI/res/layout/codelab_layout.xml để chứa thông tin sau:

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

Bố cục này tạo ra dạng xem sau:

OverlayViewController
Hình 1. OverlayViewController

Bước 2: Thêm ViewStub vào SysUIOverlayWindow

Thêm chế độ xem vào cửa sổ của bạn bằng cách thêm ViewStub vào SystemUIOverlayWindow .

Thêm mã sau vào frameworks/base/packages/CarSystemUI/res/layout/sysui_overlay_window.xml trong FrameLayout gốc:

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

Thứ tự mà ViewStubs được xác định trong FrameLayout gốc xác định thứ tự Z của các khung nhìn trong cửa sổ. Vì codelab này không liên quan đến các chế độ xem phân lớp, bạn có thể thêm đoạn mã vào bất kỳ đâu trong FrameLayout gốc.

Bước 3: Tạo OverlayViewController

Để được hiển thị và ẩn, bố cục mới phải được liên kết với OverlayViewController .

Để tạo một OverlayViewController có thể đưa vào có tên là frameworks/base/packages/CarSystemUI/src/com/android/systemui/car/codelab/CodeLabViewController.java với nội dung sau:

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);
    }
}

Bước 4: Tạo OverlayViewMediator

Một OverlayViewMediator để kích hoạt khi chế độ xem mới được hiển thị hoặc bị ẩn là bắt buộc.

Tạo một OverlayViewMediator có thể tiêm mới có tên là frameworks/base/packages/CarSystemUI/src/com/android/systemui/car/codelab/CodeLabViewMediator.java với nội dung sau:
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 } }

Bước 5: Hiển thị Chế độ xem

Để dễ hiểu và để kích hoạt chế độ xem của chúng tôi, hãy sử dụng Bluetooth khi trạng thái tắt.

Thay thế // no-op trong CodeLabViewMediator#registerListeners bằng như sau:

// 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));

Bước 6: Ẩn chế độ xem

Chế độ xem sẽ bị ẩn khi "Ẩn!" được nhấp vào nút. Vì hành động này chỉ trên nút của chế độ xem được thổi phồng nên hãy thêm trực tiếp hành động này vào OverlayViewController của bạn.

Thêm phương thức sau vào CodeLabViewController :

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

Bước 7: Định cấu hình OverlayViewMediator mới

  1. Để thêm OverlayViewMediator mới vào OverlayWindowModule, hãy thêm mã sau vào OverlayWindowModule :
    /** Injects CodeLabViewMediator. */
    @Binds
    @IntoMap
    @ClassKey(CodeLabViewMediator.class)
    public abstract OverlayViewMediator bindCodeLabViewMediator(
            CodeLabViewMediator overlayViewsMediator);
    
  2. Để thêm OverlayViewMediator mới vào config_carSystemUIOverlayViewsMediators, hãy thêm dòng sau vào config_carSystemUIOverlayViewsMediators trong frameworks/base/packages/CarSystemUI/res/values/config.xml :
    <item>com.android.systemui.car.codelab.CodeLabViewMediator</item>
    

Kết quả

Xin chúc mừng! Bạn đã tạo một dạng xem trong SystemUIOverlayWindow :

SystemUIOverlayWindow
Hình 2. SystemUIOverlayWindow

Các nguồn bổ sung

Để tìm hiểu thêm, hãy xem các tài nguyên được cung cấp bên dưới.

Mẫu OverlayViewController

Xem trình chuyển đổi người dùng toàn màn hình như một ứng dụng đơn giản của SystemUIOverlayWindow: ::

OverlayViewControllers khác

OverlayPanelViewController

OverlayPanelViewController được sử dụng để cung cấp hoạt ảnh kéo cơ bản khi hiển thị và ẩn các chế độ xem bên trong SystemUIOverlayWindow . Xem bảng Thông báo để tìm hiểu thêm: