如果在使用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);
}