直接上代码 代码中有注释可以直接看
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,这样就可以完美的显示出来了。