android中的windowTranslucentStatus和fitsSystemWindows的作用

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

android中的windowTranslucentStatus和fitsSystemWindows的作用_第1张图片

给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的变化而相应的变化)


<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的作用_第2张图片
图1

日志输出为:

statusBar height is 66
mPaddingTop is 66

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

android中的windowTranslucentStatus和fitsSystemWindows的作用_第3张图片
图2
日志输出为:

statusBar height is 66
mPaddingTop is 0

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

你可能感兴趣的:(android中的windowTranslucentStatus和fitsSystemWindows的作用)