fitsSystemWindows属性在Android中主要用于设置view的布局,使其能够根据系统窗口(如状态栏、导航栏等)进行调整。这个属性可以应用于任何view,但需要注意的是,只有当设置了透明状态栏或导航栏时,该属性才会生效。此外,fitsSystemWindows属性仅适用于Android 4.4及以上版本。
应用场景主要包括:
1. 在不同Android版本下,适配App状态栏和系统本身的状态栏;
2. 兼容带有底部虚拟按键的手机系统。
属性使用示例:
默认效果:
未对系统状态栏和导航栏做透明设置时的布局效果图。
系统窗口透明后效果:
当设置了透明状态栏(StatusBar)和透明导航栏(NavigationBar)时的效果图。
以下是透明状态栏和导航栏的代码设置示例:
```java
// 布局设置
// 或者代码设置(针对Android 7.0及以下版本)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
```
```java
// 布局设置
// 或者代码设置(针对Android 7.0及以下版本)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
```
在Android开发中,要实现状态栏(StatusBar)或导航栏(NavigationBar)变为透明并使布局扩展到它们的上方,可以通过以下两种方法实现:
方法一:使用布局设置
在布局文件中添加如下代码:
```xml
```
或者使用代码设置:
```java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
```
这种方法适用于Android 4.4及以上版本。根据Android版本的不同,状态栏和导航栏的透明样式也会有所不同。在5.0及以上版本的模拟器上进行测试时,导航栏是半透明的。
方法二:设置fitsSystemWindows属性
在根布局中添加如下代码:
```xml
... android:fitsSystemWindows="true"> ...
```
设置了`android:fitsSystemWindows="true"`属性后,针对透明的状态栏会自动添加一个值等于状态栏高度的paddingTop;针对透明的系统导航栏会自动添加一个值等于导航栏高度的paddingBottom。这样可以使布局延伸到状态栏或导航栏的位置,同时保持它们的透明效果。
解析:这个XML代码是一个Android的LinearLayout布局,包含三个TextView子视图。每个TextView有自己的背景颜色和文本内容。LinearLayout是垂直方向的,宽度和高度都设置为Match Parent(即填充整个父元素)。
代码:
```xml
android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:orientation="vertical"> android:layout_width="match_parent" android:layout_height="45dp" android:background="#66FF4081" android:gravity="center" android:text="App标题栏" android:textSize="30sp"/> android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#0CE3EE" android:gravity="center" android:text="App内容部分" android:textSize="30sp"/> android:layout_width="match_parent" android:layout_height="45dp" android:background="#4188F8" android:gravity="center" android:text="App导航栏" android:textSize="30sp"/>
```
```java
import android.content.Context;
import android.view.WindowManager;
public class StatusBarNavigationBarUtil {
public static float getStatusBarHeight(Context context){
float result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0){
result = context.getResources().getDimension(resourceId);
}
return result;
}
public static float getNavigationBarHeight(Context context){
float result = 0;
int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0){
result = context.getResources().getDimension(resourceId);
}
return result;
}
}
```