修改沉浸式状态栏透明,避免布局上移,以及兼容4.4 5.0以上的版本

直接上代码 代码中有注释可以直接看

package com.example.myapplication;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
    private LinearLayout ll_actionBar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //设置沉浸式栏透明
        addActionBar();
        //获取沉浸式状态栏高度
        int actionBarHight = getActionBarHight();
        //设置控件高度为状态栏高度,避免控件显示时整体上移
        setHight(actionBarHight);
    }

    /**
     * 设置一个占位高度,避免内容整体上移
     * @param actionBarHight
     */
    private void setHight(int actionBarHight) {
        ll_actionBar = findViewById(R.id.ll_actionBar);
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) ll_actionBar.getLayoutParams();
        params.height = actionBarHight;
        ll_actionBar.setLayoutParams(params);
    }

    /**
     * 获取沉浸式状态栏高度
     * @return
     */
    private int getActionBarHight() {
        int result = 0;
        int identifier = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (identifier>0){
            result = getResources().getDimensionPixelSize(identifier);
        }
        return result;
    }

    /**
     * 设置沉浸式状态栏透明 兼容4.4版本以上以及5.0以上
     */
    private void addActionBar() {
        if (Build.VERSION.SDK_INT >= 21) {
            View decorView = getWindow().getDecorView();
            int option = //View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            }
            //getWindow().setNavigationBarColor(Color.TRANSPARENT);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }else if (Build.VERSION.SDK_INT >= 19) {
            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);
        }
    }
}

然后是布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:background="@mipmap/bg_personfundtitle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context=".MainActivity">

    <LinearLayout
        android:orientation="vertical"
        android:id="@+id/ll_actionBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:text="normal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </RelativeLayout>

</LinearLayout>

简单说一下,我们布局里面新建了一个 LinearLayout 宽度match_parent 然后高度设置成我们的状态栏的高度,这样就满足我们布局上移的问题了。(获取状态栏的高度我这里代码备注已经写了 getActionBarHight() 方法 动态设置占位控件的高度为状态栏高度 setHight(actionBarHight)方法)ok,这样就可以完美的显示出来了。

猜你喜欢

转载自blog.csdn.net/mintent/article/details/88528199