欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自定义界面android状态栏适配问题

程序员文章站 2022-07-13 15:38:48
...

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