android中的windowTranslucentStatus和fitsSystemWindows的作用

时间:2021-01-15 03:40:15

一.Android4.4版本才有windowTranslucentStatus属性,在res文件夹下创建一个新的文件夹value-v19并新建styles.xml文件

android中的windowTranslucentStatus和fitsSystemWindows的作用

给activity设置这个style,此时该页面可以拉伸到顶部状态栏,并且定义顶部状态栏透明。

二.android:fitsSystemWindows这个属性,主要是通过调整当前设置这个属性的view的padding(paddingTop)去为我们的status_bar留下空间。

以下用代码和图片解释清楚:
1.MainActivity

package com.example.immersivemode;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.id_toolbar);
setSupportActionBar(toolbar);
Log.e("MainActivity","statusBar height is " + getStatusBarHeight(this));
}

/**
* 获取状态栏高度
*
* @param context context
* @return 状态栏高度
*/

private int getStatusBarHeight(Context context) {
// 获得状态栏高度
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
return context.getResources().getDimensionPixelSize(resourceId);
}

}

2.对应的布局文件activity_main.xml(特别注意:MyToolBar的android:layout_height必须设置成wrap_content,这样它的高度会随着paddingTop的变化而相应的变化)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">


<com.example.immersivemode.MyToolBar
android:id="@+id/id_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:fitsSystemWindows="true"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>


<TextView
android:id="@+id/id_tv_content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:text="HelloWorld"
android:textSize="30sp"/>


</LinearLayout>

3.自定义的MyToolBar(主要用来查看padding)

package com.example.immersivemode;

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.util.Log;

public class MyToolBar extends Toolbar {

public MyToolBar(Context context) {
super(context);
}

public MyToolBar(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
Log.e("MyToolBar", "mPaddingTop is " + getPaddingTop());
}
}

在4.4上运行后如下效果:

android中的windowTranslucentStatus和fitsSystemWindows的作用
图1

日志输出为:

statusBar height is 66
mPaddingTop is 66

当将activity_main.xml中的MyToolBar中的android:fitsSystemWindows=”true”去掉时,效果如下:

android中的windowTranslucentStatus和fitsSystemWindows的作用
图2
日志输出为:

statusBar height is 66
mPaddingTop is 0

由此可见,当设置android:fitsSystemWindows = true时,系统会为该view设置paddingTop(大小等于状态栏的高度),从而实现图1的效果