验证所用版本:minSdk: 26 compileSdk: 35 targetSdk: 35
我们在使用Android Studio自动创建activity及其视图的时候(如图1),所生成的默认Activity类中,往往会有以下代码。
图1 使用 Android Studio 创建 Activity
package com.example.cp06;
import android.os.Bundle;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EdgeToEdge.enable(this); //代码1
// 代码2
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
}
}
上面代码1
和代码2
是以前项目里没见过的,他们是干什么的呢?先来运行一下
图2 直接运行的效果图
可以发现状态栏是白色的,顶部导航栏在状态栏之下,并且状态栏的背景与Activity的背景都是桔色,这是因为Android 15开始,系统自动开启了全面屏体验
当去掉代码1,我们可以发现上面的状态栏字的颜色变得特别浅,与activity不一致,与系统的字体颜色一致。说明虽然Android 15开启了全面屏体验,但是还是需要EdgeToEdge.enable(this)
来控制字体的一致性
图3&图4 去掉代码1的效果
当去掉代码1和代码2,我们可以发现文本内容开始从状态栏显示,所以我们可以知道使用代码2可以设置视图开始显示的位置,通过代码可以看出,是设置了padding,具体的padding值应该是避开了状态栏和导航栏,也就是系统栏 (systembar): 等于状态栏 + 导航栏 (参考:developer.android.google.cn/training/sy…)
图5 去掉代码1和代码2的效果
所以在新版本(Android 15及以后),要注意添加这两个函数,因为系统自动开启了全面屏体验。
现在我们在去掉代码1和代码2的情况下,调整版本为
minSdk: 21 compileSdk: 31 targetSdk: 31
运行效果如图6
图6 低版本的运行图
发现全面屏体验消失了,状态栏和导航栏都有自己的系统自己的颜色。与activity不一致了。一些老的学习项目就是这样的样式。如果让老版本的activity也有全面屏体验,可以借鉴两篇文章:
- Android 15新特性,强制edge-to-edge全面屏体验_enableedgetoedge-CSDN博客
- 在视图中以无边框方式显示内容 | Views | Android Developers
这里我尝试了一下,把SDK改成34,不添加代码1
无法开启全面屏模式
图7 低版本不添加代码1
添加代码1
不添加代码2
,全面屏开启,但是文本重叠了
图8 低版本添加代码1, 不添加代码2
两者都添加,开启了全面屏模式,文本也正常显示。图9 低版本添加代码1和代码2
上面两个文档提示需要添加androidx.activity:activity:xxxx
,实验中使用了implementation 'androidx.appcompat:appcompat:1.7.0'
,里面依赖了androidx.activity:activity:1.8.0
dependencies {
...
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'com.google.android.material:material:1.12.0'
...
}