Esta página explica cómo crear una vista en SystemUIOverlayWindow
.
Antes de que empieces
El contenido proporcionado a continuación supone que ha leído estos artículos sobre la interfaz de usuario del sistema:
Este artículo:
- Se supone que está familiarizado con los casos de uso del sistema operativo Android Automotive y su
SystemUIOverlayWindow
. - Proporciona ejemplos de determinadas subclases de
OverlayViewController
. - No aborda las subclases de
OverlayViewController
. - No explica cómo configurar Android para el desarrollo.
- No describe cada opción que se puede anular en las clases base. Más bien describe sólo aquellos necesarios para configurar una vista básica.
Completa el laboratorio de código
Paso 1: crear un diseño para OverlayViewController
Cree un archivo denominado frameworks/base/packages/CarSystemUI/res/layout/codelab_layout.xml
que contenga lo siguiente:
<?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>
Este diseño crea la siguiente vista:
Paso 2: agregue un ViewStub a SysUIOverlayWindow
Agregue la vista a su ventana agregando un ViewStub a SystemUIOverlayWindow
.
Agregue el siguiente código a frameworks/base/packages/CarSystemUI/res/layout/sysui_overlay_window.xml
en la raíz FrameLayout
:
<ViewStub android:id="@+id/codelab_stub" android:layout_width="match_parent" android:layout_height="match_parent" android:layout="@layout/codelab_layout"/>
El orden en el que se definen ViewStubs en el FrameLayout
raíz define el orden Z de las vistas en la ventana. Dado que este codelab no implica vistas en capas, puedes agregar el fragmento de código en cualquier lugar del FrameLayout
raíz.
Paso 3: crear un OverlayViewController
Para mostrarse y ocultarse, el nuevo diseño debe estar vinculado a un OverlayViewController .
Para crear un OverlayViewController
inyectable llamado frameworks/base/packages/CarSystemUI/src/com/android/systemui/car/codelab/CodeLabViewController.java
con el siguiente contenido:
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); } }
Paso 4: crear un OverlayViewMediator
Se requiere un OverlayViewMediator para activar cuando se muestra u oculta una nueva vista.
Cree un nuevoOverlayViewMediator
inyectable llamado frameworks/base/packages/CarSystemUI/src/com/android/systemui/car/codelab/CodeLabViewMediator.java
con el siguiente contenido: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 } }
Paso 5: muestra la vista
Para facilitar la comprensión y activar nuestra vista, use Bluetooth cuando el estado esté desactivado.
Reemplace // no-op
en CodeLabViewMediator#registerListeners
con lo siguiente:
// 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));
Paso 6: Ocultar la vista
La vista quedará oculta cuando aparezca el mensaje "¡Ocultar!" Se hace clic en el botón. Dado que esta acción solo se realiza en el botón de la vista inflada, agréguela directamente a su OverlayViewController
.
Agregue el siguiente método a CodeLabViewController
:
@Override protected void onFinishInflate() { getLayout().findViewById(R.id.codelab_button).setOnClickListener(v -> { stop(); }); }
Paso 7: configurar el nuevo OverlayViewMediator
- Para agregar el nuevo OverlayViewMediator a OverlayWindowModule, agregue el siguiente código a OverlayWindowModule :
/** Injects CodeLabViewMediator. */ @Binds @IntoMap @ClassKey(CodeLabViewMediator.class) public abstract OverlayViewMediator bindCodeLabViewMediator( CodeLabViewMediator overlayViewsMediator);
- Para agregar el nuevo OverlayViewMediator a config_carSystemUIOverlayViewsMediators, agregue la siguiente línea a config_carSystemUIOverlayViewsMediators en
frameworks/base/packages/CarSystemUI/res/values/config.xml
:<item>com.android.systemui.car.codelab.CodeLabViewMediator</item>
Resultado
¡Felicidades! Creaste una vista en SystemUIOverlayWindow
:
Recursos adicionales
Para obtener más información, consulte los recursos que se proporcionan a continuación.
Ejemplo de controlador OverlayView
Vea el conmutador de usuario de pantalla completa como una aplicación sencilla de SystemUIOverlayWindow:
:
Otros controladores OverlayView
SuperposiciónPanelViewController
Se utiliza un OverlayPanelViewController para proporcionar una animación de arrastre básica al mostrar y ocultar vistas dentro de SystemUIOverlayWindow
. Consulte el panel de notificaciones para obtener más información: