新版本的Android Studio生成的Activity怎么变了样? | 全面屏体验 | EdgeToEdge

1,305 阅读3分钟

验证所用版本:minSdk: 26 compileSdk: 35 targetSdk: 35

我们在使用Android Studio自动创建activity及其视图的时候(如图1),所生成的默认Activity类中,往往会有以下代码。

图1 使用Android Studio 创建 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是以前项目里没见过的,他们是干什么的呢?先来运行一下

image.png

图2 直接运行的效果图

可以发现状态栏是白色的,顶部导航栏在状态栏之下,并且状态栏的背景与Activity的背景都是桔色,这是因为Android 15开始,系统自动开启了全面屏体验

当去掉代码1,我们可以发现上面的状态栏字的颜色变得特别浅,与activity不一致,与系统的字体颜色一致。说明虽然Android 15开启了全面屏体验,但是还是需要EdgeToEdge.enable(this)来控制字体的一致性

image.png

image.png

图3&图4 去掉代码1的效果

当去掉代码1和代码2,我们可以发现文本内容开始从状态栏显示,所以我们可以知道使用代码2可以设置视图开始显示的位置,通过代码可以看出,是设置了padding,具体的padding值应该是避开了状态栏和导航栏,也就是系统栏 (systembar): 等于状态栏 + 导航栏 (参考:developer.android.google.cn/training/sy…)

image.png

图5 去掉代码1和代码2的效果

所以在新版本(Android 15及以后),要注意添加这两个函数,因为系统自动开启了全面屏体验。

现在我们在去掉代码1和代码2的情况下,调整版本为

minSdk: 21 compileSdk: 31 targetSdk: 31

运行效果如图6

image.png

图6 低版本的运行图

发现全面屏体验消失了,状态栏和导航栏都有自己的系统自己的颜色。与activity不一致了。一些老的学习项目就是这样的样式。如果让老版本的activity也有全面屏体验,可以借鉴两篇文章:

  1. Android 15新特性,强制edge-to-edge全面屏体验_enableedgetoedge-CSDN博客
  2. 在视图中以无边框方式显示内容  |  Views  |  Android Developers

这里我尝试了一下,把SDK改成34,不添加代码1无法开启全面屏模式

image.png

图7 低版本不添加代码1

添加代码1不添加代码2,全面屏开启,但是文本重叠了

image.png

图8 低版本添加代码1, 不添加代码2

两者都添加,开启了全面屏模式,文本也正常显示。

image.png

图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'
    ...
}