Android WebView全屏、自定义大小异形屏适配方案(可做成SDK 提供Unity接入,切后台前台不会黑屏,一个Activity)

本文介绍了一种在Android中使WebView既能够全屏显示又能自定义大小的方法,通过配置styles.xml、AndroidManifest.xml以及实现特定的Activity方法,实现了对异形屏和折叠屏的良好支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果在使用webview时,需要即可以全屏使用,又可以自定义大小使用,则需要做以下处理来适配异形屏:

1. styles.xml里webView主题选择Dialog,并设置以下属性

<style name="WebViewTheme" parent="@android:style/Theme.Dialog"> //可选择其他Dialog主题
    <item name="android:windowBackground">@android:color/transparent</item> //设置Dialog的背景透明
    <item name="android:windowFrame">@null</item> //Dialog的windowFrame框为无
    <item name="android:windowIsFloating">true</item> //是否浮现在activity之上
    <item name="android:windowNoTitle">true</item> //是否不显示title
    <item name="android:backgroundDimEnabled">false</item> //背景是否模糊显示
</style>

2. AndroidManifest.xml的WebView的Activity设置以下属性

android:configChanges="keyboardHidden|navigation|orientation|screenSize"
android:theme="@style/WebViewTheme"

 3. WebView的Activity异形屏适配

1) 在 super.onCreate() 之前调用 openFullScreenModel(activity); 此方法需要API >= 28才能使用,用于添加布局前直接设置全屏,防止打开webView时出现由小变大的过程。(如果API >= 28不好保证,可以不调用此方法,重写onWindowFocusChanged 方法也可实现适配,但会有很短的由小变大的过程。参考步骤 3) 

public void openFullScreenModel(Activity activity)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
    {
        activity.requestWindowFeature(Window.FEATURE_NO_TITLE);
        WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
        lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
        activity.getWindow().setAttributes(lp);
        View decorView = activity.getWindow().getDecorView();
        int systemUiVisibility = decorView.getSystemUiVisibility();
        int flags = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN;
        systemUiVisibility |= flags;
        activity.getWindow().getDecorView().setSystemUiVisibility(systemUiVisibility);
    }
}

2) 在onCreate() 的 setContentView() 之后调用

setFullScreen(true);

 setFullScreen方法实现如下

private void setFullScreen(boolean fullScreen)
{
    getWindow().setLayout(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.FILL_PARENT);
    if (fullScreen)
    {
        WindowManager.LayoutParams attr = getWindow().getAttributes();
        attr.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
        getWindow().setAttributes(attr);
    }
    else
    {
        final WindowManager.LayoutParams attrs = getWindow().getAttributes();
        attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().setAttributes(attrs);
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
    {
        if (fullScreen)
        {
            View decorView = getWindow().getDecorView();
            int systemUiVisibility = decorView.getSystemUiVisibility();
            systemUiVisibility |= View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
            getWindow().getDecorView().setSystemUiVisibility(systemUiVisibility);
        }
        else
        {
            View decorView = getWindow().getDecorView();
            int systemUiVisibility = decorView.getSystemUiVisibility();
            systemUiVisibility &= (~View.SYSTEM_UI_FLAG_FULLSCREEN);
            systemUiVisibility &= (~View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            systemUiVisibility &= (~View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            getWindow().getDecorView().setSystemUiVisibility(systemUiVisibility);
        }
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
    {
        View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        );
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,
        WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    }
}

3) 在合适时机设置webview的外边距

  • 在 显示 webView 时 调用 setMargin();
webView.loadUrl(url);
setMargin();
  •  在 屏幕旋转时 调用 setMargin(); 重写Activity的 onConfigurationChanged 方法
@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setMargin();
}

 setMargin 方法实现方式如下:

private void setMargin()
{
    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams)webView.getLayoutParams();
    int[] margins = YHSDKWebView.getWebViewInstance().getMargin();
    lp.setMargins(margins[0], margins[1], margins[2], margins[3]);
    webView.setLayoutParams(lp);
}


以上便是WebView实现全屏及自定义大小的异形屏、折叠屏适配方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值