Android se adapta a Android 9.0, se adapta a pantalla completa, Dialog o DialogFragment se adapta a pantalla completa

El código para detectar si hay una pantalla con forma especial, una pantalla con muesca o una pantalla con forma de gota de agua se encuentra al final.

Parámetros de configuración de varios fabricantes de teléfonos móviles en Android 8.0:

<!-- 全面屏 vivo/oppo o版本刘海屏配置项 -->
        <meta-data
            android:name="android.max_aspect"
            android:value="2.6" />
        <!-- 刘海屏华为o版本配置,如果不配置则不使用华为o系统刘海区域 -->
        <meta-data
            android:name="android.notch_support"
            android:value="true" />
        <!-- 刘海屏小米o版本配置,如果不配置则不使用小米o系统刘海区域 -->
        <meta-data
            android:name="notch.config"
            android:value="portrait|landscape" />

La actividad se adapta a pantalla completa:

Anular el método onAttachedToWindow() en Actividad no tendrá efecto en el método OnCreate.

/**
     * 生命周期 onCreate->onStart->onResume->onAttachedToWindow
     * 判断是否是异形屏,必须在此方法
     */
    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        //适配安卓Q全面屏
        setActivityAndroidP(this);
    }

/**
     * 安卓P(9.0系统) 适配Activity页面的全屏
     */
    public static void setActivityAndroidP(Activity activity) {
        //设置全屏展示
        if (Build.VERSION.SDK_INT >= 28) {
            if (activity != null && activity.getWindow() != null) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);//全屏显示
                WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
                lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
                activity.getWindow().setAttributes(lp);
            } else {
                PlatformLog.e("activity全屏设置失败,activity或window为空");
            }
        }
    }

Dialog o DialogFragment se adapta a pantalla completa:

Anule el método onActivityCreated(Bundle saveInstanceState) y llámelo dentro:

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //适配安卓Q全面屏
        setDialogAndroidP(getDialog());
    }

/**
     * 安卓P(9.0系统) 适配dialogFragment页面的全屏
     */
    public static void setDialogAndroidP(Dialog dialog) {
        //设置全屏展示
        if (Build.VERSION.SDK_INT >= 28) {
            if (dialog != null && dialog.getWindow() != null) {
                dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);//全屏显示
                WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
                lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
                dialog.getWindow().setAttributes(lp);
            } else {
                PlatformLog.e("dialog全屏设置失败,dialog或window为空");
            }
        }
    }

Una vez completada la configuración de pantalla completa, aparece un área de tecla virtual en el teléfono móvil Xiaomi Mi 11. Esta área es negra de forma predeterminada, lo cual es muy inconsistente con la pantalla general. A veces no se puede mostrar en pantalla completa. La solución es como sigue:

La actividad se establece antes del método de configuración setContentView():

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //沉浸式
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        //设置虚拟按键的背景颜色
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setNavigationBarColor(Color.parseColor("#FFFF00"));
        }
        setContentView(R.layout.activity_main);
}

Este código se establece en Dialog o DialogFragment, pero se descubre que el color de fondo del botón virtual no tiene efecto y el color de fondo virtual no se puede modificar cuando la Actividad establece el siguiente tema:

 android:theme="@android:style/Theme.Translucent.NoTitleBar"
 android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"

Así que decidí probar un tema personalizado y finalmente logré el efecto con éxito:

1. Configure el color de fondo virtual de Dialog o DialogFragment por separado:

Personalizar en valores/estilos.xml:

<!--设置虚拟按键navigationBarColor属性,安卓5.0之后生效,DialogFragment在代码中设置无效-->
    <style name="dialog_fragment_navigationBarColor_style">
        <item name="android:windowFullscreen">true</item>
    </style>

Cree valores-v21/styles.xml, debido a que las claves virtuales se introducen en Android 5.0, defina el error directamente en valores/styles.xml:

  <!--设置虚拟按键navigationBarColor属性,安卓5.0之后生效,DialogFragment在代码中设置无效-->
    <style name="dialog_fragment_navigationBarColor_style">
        <!-- 下面配置来自参数二setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);-->
        <item name="android:windowFullscreen">true</item>
        <item name="android:navigationBarColor">#FFFFFF</item><!--虚拟按键背景,DialogFragment在代码中设置无效-->
    </style>

 La imagen de configuración es la siguiente:

Llamado en el método onCreate() de Dialog o DialogFragment:

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.dialog_fragment_navigationBarColor_style);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (getDialog() != null && getDialog().getWindow() != null) {
            getDialog().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//沉浸式
        }
    }

2. Toda la APLICACIÓN implementa colores de botones virtuales:

1. Personalizar en valores/estilos.xml:

<!--适配全面屏和底部虚拟键背景的自定义style,直接使用@android:style/Theme.Light.NoTitleBar.Fullscreen会
        导致底部虚拟键背景设置颜色失败-->
    <style name="no_title_style">
        <item name="android:windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>

2. Cree valores-v21/styles.xml. Debido a que las claves virtuales se introdujeron en Android 5.0, defina el informe de error directamente en valores/styles.xml:

 <!--适配全面屏和底部虚拟键背景的自定义style,直接使用@android:style/Theme.Light.NoTitleBar.Fullscreen会
        导致底部虚拟键背景设置颜色失败-->
    <style name="no_title_style">
        <item name="android:windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:navigationBarColor">#FFFF00<!--虚拟按键背景,DialogFragment在代码中设置无效-->
    </style>

3. Utilice el estilo definido anteriormente en Activiyt de manera uniforme:

<activity
            android:name=".MainActivity"
            android:theme="@style/no_title_style">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Finalmente, toda la Actividad, Fragmento, Diálogo y DialogFragment se muestran en pantalla completa y el color de fondo de la navegación virtual también se modifica con éxito.

Para la detección de pantalla con formas especiales, consulte mi otro blog, simplemente copie la herramienta y úsela:

https://blog.csdn.net/zhao8856234/article/details/117747273?spm=1001.2014.3001.5501

 

Supongo que te gusta

Origin blog.csdn.net/zhao8856234/article/details/117744924
Recomendado
Clasificación