Android 沉浸状态

来源:互联网 发布:南京润和软件 编辑:程序博客网 时间:2024/06/02 03:57

一. 介绍

Android4.4之前Android手机的应用状态栏都是黑色的比较难看,google在Android4.4以上之后提供了设置状态栏的方法,支持沉浸式状态栏的App的界面显得逼格更高一点。

二.实际使用

    1.在代码中应用

在4.4中直接使用

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {    
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

        在5.0以上使用

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

    window.setStatusBarColor(Color.TRANSPARENT);

}

在6.0上以上设置字体颜色

大部分手机默认状态栏字体颜色是白色的,如果Toolbar或者界面头部的颜色较浅,那么状态栏上白色的字看不怎么清楚。Android 6.0以后,我们可以使用代码将状态栏字体的颜色设置为黑色了,代码如下:

window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

添加之后遇见的问题

(1)输入框软键盘弹出把toolbar顶没了

  主要是fitsSystemWindows = “true”属性导致 

解决FLAGTRANSLUCENTSTATUS导致输入框被软键盘覆盖的解决方案

代码如下:

public class AndroidBug5497Workaround {    public static void assistActivity(View content) {        new AndroidBug5497Workaround(content);    }    private View mChildOfContent;    private int usableHeightPrevious;    private ViewGroup.LayoutParams frameLayoutParams;    private AndroidBug5497Workaround(View content) {        if (content != null) {            mChildOfContent = content;            mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {                public void onGlobalLayout() {                    possiblyResizeChildOfContent();                }            });            frameLayoutParams = mChildOfContent.getLayoutParams();        }    }    private void possiblyResizeChildOfContent() {        int usableHeightNow = computeUsableHeight();        if (usableHeightNow != usableHeightPrevious) {            //如果两次高度不一致            //将计算的可视高度设置成视图的高度            frameLayoutParams.height = usableHeightNow;            mChildOfContent.requestLayout();//请求重新布局            usableHeightPrevious = usableHeightNow;        }    }    private int computeUsableHeight() {        //计算视图可视高度        Rect r = new Rect();        mChildOfContent.getWindowVisibleDisplayFrame(r);        return r.bottom;    }}

添加上面的类,然后在Activity的onCreate方法中的setContentView后面加上如下代码:

AndroidBug5497Workaround.assistActivity(findViewById(android.R.id.content));
该方案的原理是,给界面的根布局设置一个监听器,当界面大小有变化的时候,如键盘弹出的时候,重新设置一下根布局的高度,再调用requestLayout对界面进行重绘。


CoordinatorLayout+AppBarLayout滑动出现问题

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {    ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.root_container_layout), new android.support.v4.view.OnApplyWindowInsetsListener() {        @Override       public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {            return insets.consumeSystemWindowInsets();       }    });}

原创粉丝点击