Red de conocimiento informático - Conocimiento sistemático - Modificación de la barra de navegación de origen

Modificación de la barra de navegación de origen

Actualmente, la adaptación comúnmente utilizada de la barra de estado inmersiva es generalmente una configuración estilística.

litem name = "Android: ventana de navegación translúcida" gtfalse lt/item gt;

litem name = "Android: ventana de navegación translúcida" gt true lt/item gt;

p>

O establezca una bandera para la ventana, por ejemplo:

if (build. SDK_INT gt= 21) {

int option = View. System_UI_Logo_Layout_Fullscreen

|Ver. SISTEMA _ UI _ FLAG _ DISEÑO _ ESTABLE

vista de decoración setsystemuivisibility(opción);

window.setStatusBarColor(Color.Transparent

}

}

p>

Entonces coopere: fitSystemWindows = true para resolver el problema de que algunos controles no requieren inmersión.

Por supuesto, hay más salvajes que fijan directamente la altura de la barra de estado, como tim, NetEase Cloud Music, mobile Taobao, etc.

Cuando la altura de la barra de estado es 0, se expone instantáneamente. Por supuesto, también los hay buenos, como WeChat.

En el desarrollo real, estas API no pueden satisfacer nuestras búsquedas visuales en absoluto, y la más común es la página de inicio. Algunas pestañas requieren inmersión y otras no, por lo que no se puede lograr a la perfección.

Luego está la barra de navegación virtual, configure

ltitem name = "Android: ventana de navegación translúcida" gttrue lt/item gt; y algunos otros El problema no es demasiado problemático de resolver, por lo que no entraré en detalles aquí.

Otro problema es que cuando aparece el teclado virtual, el diseño se sobrescribe o desaparece. Por supuesto, este problema también es fácil de resolver.

Configurar Android: el modo de entrada del software de Windows = "Ajustar cambio de tamaño" o ajustarPan puede resolver fácilmente la mayoría de los problemas.

Aunque los tres problemas anteriores pueden ser complejos o sencillos de resolver, resulta algo complicado alcanzar algunos requisitos exigentes.

Si se pueden monitorear los cambios de altura de la barra de estado, la barra de navegación y el teclado virtual, ¿se pueden resolver y se pueden implementar algunas funciones más interesantes?

¿Cómo monitorear los cambios de altura de la barra de estado, barra de navegación y teclado virtual?

A continuación, primero estudiamos cómo el sistema maneja estos problemas.

Primero, usemos el visor de diseño para ver el diseño de la interfaz.

Como puede ver, cuando la barra de estado inmersiva no está configurada, paddingtop y marginBottom están configurados para la vista 0 de la vista decorativa, y las dos vistas se superponen en la parte superior como el color de la barra de estado y barra de navegación.

Cuando aparece el método de entrada, también se logra configurando el paddingBottom de la vista 0 de la revisión, lo que significa que la vista 0 de la revisión puede escuchar lo que queremos.

Al observar el código fuente del sistema, finalmente encontré el método de vew despachoApplyWindowInsets.

Mira atentamente este código fuente.

Finalmente, encontré una manera de configurar el relleno para la vista.

Al mismo tiempo, se descubrió que decorView restableció el método onApplyWindowInsets, donde se agregaba una vista de fondo como color de la barra de estado y la barra de navegación.

DecorView*** tiene cinco llamadas lógicas a addView, por lo que no entraré en cómo implementarlas.

Ahora que conocemos la solución del sistema, solo necesitamos recibir el monitoreo correspondiente cuando el sistema llame a despachoApplyWindowInsets.

Afortunadamente el sistema nos proporciona el método setOnApplyWindowInsetsListener.

Verifiquemos nuestros resultados.

En este punto, se han discutido los aspectos centrales a discutir y solo queda la cuestión del uso.

En cuanto a cómo utilizarlo, puedes elegirlo según tu situación personal. Sólo hay dos formas de utilizarlo.

Aquí hay una advertencia. setOnApplyWindowInsetsListener destruirá el mecanismo de entrega de eventos del sistema.

Sin embargo, se puede solucionar llamando manualmente a onApplyWindowInsets.

val view group = ventana . dec ver como grupo de vista

view group . setonapplywindowinsets listener { v,insets- gt; ")

5. Publicaciones

//Aquí notificamos dinámicamente los controles que deben adaptarse a la barra de estado, la barra de navegación y el método de entrada.

}

v.onapplywindowsets(insets)

}

2. El plan de adaptación para interrumpir completamente el sistema lo manejamos nosotros mismos. , por ejemplo:

grupo de vista val = ventana vista dec como grupo de vista

grupo de vista[0]. setonapplywindowinsets listener { v,insets- gt;

println(" - $insets ")

5. Publicaciones

// Las notificaciones dinámicas aquí requieren adaptación Controles para barra de estado, barra de navegación y método de entrada.

insets.run {

//Depende de la situación

//v . set padding(stableinesetleft, stableInsetTop, stableInsetRight, stableInsetBottom)

.

v .set padding(systemwindowinsettleft,systemWindowInsetTop,systemWindowInsetRight,0)

val h = findViewById ltviewgt(R.id.llBottom)? . ¿altura? : 0

findViewById ltview gt(R.id.flEt)? . setPadding(0, 0, 0, systemWindowInsetBottom-h)

}

}

insets .consumesystemwindowinsets()

}

En cuanto a por qué necesita monitorear en la vista 0 de decorView, debe investigarlo usted mismo.

Entre ellos, el segundo método puede lograr un efecto de barra de estado inmersivo sin establecer ningún estilo o bandera para la actividad. También es más jugable.

Si coincide,

litem name = "Android: ventana de navegación translúcida" gttrue lt/item gt; En cuanto a hasta dónde puede llegar, depende de las ideas de cada uno.

A estas alturas ya está todo escrito.

Finalmente, se presenta un escenario alcanzable:

Cuando aparece el método de entrada, podemos personalizar los controles que deben activarse.