自定义界面android状态栏适配问题
App出现界面被遮挡,通常是因为自定义状态栏(透明,自动隐藏)或者系统沉浸式状态栏导致。 主流的解决方法是下面这两个
1.布局xml中,增加android:fitsSystemWindows="true"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:fitsSystemWindows="true">
</LinearLayout>
Boolean internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows. Will only take effect if this view is in a non-embedded activity.
如果fitsSystemWindows为true,会自动调整这个视图的内边距与系统窗口的距离
2.沉浸式状态栏特殊处理,可以通过代码(或者样式Style配置)
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
android.view.Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
//window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//window.setStatusBarColor(Color.BLACK);
}
但是我这边维护的旧版App在部分手机出现了界面底部内容被悬浮的工具栏所遮挡,App中是采用一些第三方组件或者过时的Api实现的控件,采用了上面两种方法处理后,客户反映在部分日韩手机少部分型号还是存在问题(eg:SM-G9750; SM-A51; Xperia 1),系统版本是android8.0以上。
通过添加日志,分别打印出手机界面大小,界面各个View的实际高度,找到问题是有些系统对View的渲染高度,或者PaddingBottom出现了计算错误,可能和一些过时的Api有关,也可能和修改显示字体,界面缩放比例,悬浮式工具栏等相关,透明导航栏等有关。
找到问题就好办,可以根据自己的界面需要,判断是否需要重置大小,重置padding 通过自己计算View实际的值,并修复。我采用的方法是结合fitsSystemWindows,计算出对应的padding值,在需要的时,调用 view.setPadding
//伪代码
ViewPadding vp = this.getViewPadding(view);
if(vp.needResetPadding()){
view.setPadding(vp.getPaddingLeft(), vp.getPaddingTop(), vp.getPaddingRight(), vp.getPaddingBottom());
}
padding值正确后,界面会自适应匹配
贴出几个可能使用得到的代码参考
1.字体和缩放相关的设置
DisplayMetrics metrics = new DisplayMetrics();
Configuration configuration = activity.getResources().getConfiguration();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
//metrics.scaledDensity = configuration.fontScale * metrics.density;
2.获取窗体大小 (View 和 DecorView Size可直接获取,但需要在创建View之后)
WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
Point outSize = new Point();
wm.getDefaultDisplay().getSize(outSize);
上一篇: Android Notification自定义样式
下一篇:
spring中的
推荐阅读
-
Android自定义View实现微信语音界面
-
Android:自定义checkbox并解决内容及复选框之间的问题
-
Android自定义View模仿虎扑直播界面的打赏按钮功能
-
android修改状态栏的颜色等问题
-
Android适配利用webview加载后图片显示过大的问题解决
-
Android自定义ViewGroup实现竖向引导界面
-
解决Android 沉浸式状态栏和华为虚拟按键冲突问题
-
Android wifi连接 适配 Android 10 api 29 失败问题
-
Android 自定义通知Notification 适配不同背景颜色
-
Android自定义通知栏Notification字体适配问题