Android は Android 9.0 に適応し、全画面に適応し、Dialog または DialogFragment は全画面に適応します

特殊な形状のスクリーン、ノッチスクリーン、水滴スクリーンの有無を検出するコードが最後にあります。

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" />

アクティビティは全画面に適応します。

Activity で onAttachedToWindow() メソッドをオーバーライドしても、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 または DialogFragment は全画面に適応します。

onActivityCreated(Bundle SavedInstanceState) メソッドをオーバーライドし、内部で呼び出します。

    @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为空");
            }
        }
    }

全画面設定が完了すると、Xiaomi Mi 11 携帯電話に仮想キー領域が表示されます。この領域はデフォルトでは黒で、画面全体と非常に不一致です。場合によっては全画面表示できないことがあります。解決策は次のとおりです。次のように:

アクティビティは、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);
}

このコードは Dialog または DialogFragment に設定されていますが、仮想ボタンの背景色が有効にならず、アクティビティで次のテーマを設定している場合、仮想背景色を変更できないことがわかります。

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

そこで、カスタム テーマを試してみることにしました。そして、最終的に効果を達成することに成功しました。

1. Dialog または DialogFragment の仮想背景色を個別に設定します。

value/styles.xml でカスタマイズします。

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

Android 5.0 では仮想キーが導入されているため、values-v21/styles.xml を作成し、values/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>

 構成図は次のとおりです。

Dialog または DialogFragment の onCreate() メソッドで呼び出されます。

    @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. アプリ全体に仮想ボタンの色を実装します。

1.values/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>
    </style>

2.values-v21/styles.xml を作成します。仮想キーは Android 5.0 で導入されたため、values/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. 上で定義したスタイルを Activet で均一に使用します。

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

最後に、Activity、Fragment、Dialog、DialogFragment がすべて全画面表示され、仮想ナビゲーションの背景色も正常に変更されました。

特殊な形状の画面検出については、私の他のブログを参照してください。ツールをコピーして使用してください。

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

 

おすすめ

転載: blog.csdn.net/zhao8856234/article/details/117744924