首页 > 其他分享 >第2天:熟悉Android Studio补充材料——`MainActivity.kt`解读

第2天:熟悉Android Studio补充材料——`MainActivity.kt`解读

时间:2024-10-09 23:47:44浏览次数:13  
标签:androidx 插图 activity 视图 MainActivity Studio kt import main

下面是对“第2天:熟悉Android Studio”该文学习的更深层次的补充材料,对 MainActivity.kt 文件的理解。
下面对MainActivity.kt 文件中每一行进行详细解释:

package com.example.helloworldapp


import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
    }
}

逐行解释

1. 包声明

package com.example.helloworldapp
  • 解释
    • 定义了该Kotlin文件所属的包名。包名是应用的唯一标识符,通常采用反向域名格式。
    • 在Android项目中,包名用于组织代码和资源,确保类名的唯一性。

2. 导入语句

import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
  • 解释
    • import android.os.Bundle
      • 导入 Bundle 类,用于在活动(Activity)之间传递数据。
    • import androidx.activity.enableEdgeToEdge
      • 导入 enableEdgeToEdge 扩展函数,用于启用边缘到边缘的显示效果。
    • import androidx.appcompat.app.AppCompatActivity
      • 导入 AppCompatActivity 类,这是一个兼容旧版Android的活动基类,提供了现代Android功能的支持。
    • import androidx.core.view.ViewCompatimport androidx.core.view.WindowInsetsCompat
      • 导入 ViewCompatWindowInsetsCompat 类,用于处理视图的窗口插图和兼容性问题。

3. 活动类声明

class MainActivity : AppCompatActivity() {
  • 解释
    • 声明了一个名为 MainActivity 的类,继承自 AppCompatActivity
    • AppCompatActivity
      • 提供了向后兼容的功能,确保应用在不同版本的Android设备上表现一致。
      • 支持ActionBar(工具栏)、主题和其他现代Android组件。

4. onCreate 方法

    override fun onCreate(savedInstanceState: Bundle?) {
  • 解释
    • 重写了 AppCompatActivityonCreate 方法,这是活动的生命周期方法之一。
    • onCreate
      • 在活动创建时调用,用于初始化活动的状态、设置布局和其他必要的设置。

5. 调用父类的 onCreate

        super.onCreate(savedInstanceState)
  • 解释
    • 调用父类(AppCompatActivity)的 onCreate 方法,确保活动的基础部分得到正确初始化。
    • 重要性
      • 保证活动的正常生命周期管理和其他内部机制的正确运行。

6. 启用边缘到边缘显示

    enableEdgeToEdge()
  • 解释
    • 调用 enableEdgeToEdge 扩展函数,启用应用的边缘到边缘显示效果。
    • 边缘到边缘显示(Edge-to-Edge Display)
      • 允许应用的内容延伸到屏幕的所有边缘,包括状态栏和导航栏区域,提供更沉浸式的用户体验。

7. 设置内容视图

    setContentView(R.layout.activity_main)
  • 解释
    • activity_main.xml 布局文件设置为活动的内容视图。
    • setContentView
      • 负责将布局文件加载到活动中,显示在用户界面上。
    • R.layout.activity_main
      • 引用 res/layout/activity_main.xml 文件中的布局资源。

8. 设置窗口插图监听器

        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
  • 解释
    • 使用 ViewCompat 设置一个窗口插图(Window Insets)监听器,监听特定视图的插图变化。
    • findViewById(R.id.main)
      • 查找布局文件中 idmain 的视图。
      • R.id.main
        • 通常对应 activity_main.xml 中根布局的 android:id="@+id/main" 属性。
    • setOnApplyWindowInsetsListener
      • 设置一个监听器,当视图的窗口插图(如状态栏、导航栏)发生变化时调用。
    • Lambda 表达式 { v, insets -> ... }
      • 定义了当窗口插图变化时执行的操作。

9. 获取系统栏的插图

            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
  • 解释
    • 从传入的 insets 对象中获取系统栏(状态栏和导航栏)的插图区域。
    • getInsets(WindowInsetsCompat.Type.systemBars())
      • 返回一个 Insets 对象,包含系统栏的左右、上、下边距。

10. 设置视图的内边距

            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
  • 解释
    • 根据获取的系统栏插图,为视图设置相应的内边距(padding),以避免内容被系统栏覆盖。
    • v.setPadding(left, top, right, bottom)
      • 设置视图的四个方向的内边距。

11. 返回插图对象

            insets
        }
  • 解释
    • OnApplyWindowInsetsListener 的回调中,返回处理后的 insets 对象。
    • 目的
      • 确保插图的继续传递和后续处理,不影响其他视图的插图设置。

12. 关闭方法和类

    }
}
  • 解释
    • 结束 onCreate 方法和 MainActivity 类的定义。

总结

这段代码的主要功能是:

  1. 初始化活动

    • 调用父类的 onCreate 方法,确保活动的基本生命周期正确运行。
  2. 启用边缘到边缘显示

    • 通过 enableEdgeToEdge 扩展函数,使应用内容能够延伸到屏幕的所有边缘,提供更沉浸式的用户体验。
  3. 设置布局

    • 使用 setContentView 方法将 activity_main.xml 布局文件加载为活动的内容视图。
  4. 处理窗口插图

    • 设置一个 OnApplyWindowInsetsListener 监听器,监听窗口插图的变化。
    • 根据系统栏(状态栏和导航栏)的插图,为特定视图设置内边距,确保内容不会被系统栏覆盖。

额外建议

1. 确保布局文件正确配置

确保您的 activity_main.xml 文件中根布局的 id 设置为 main,以便 findViewById(R.id.main) 能正确找到该视图。例如:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"  <!-- 确保设置了id -->
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <TextView
        android:id="@+id/tvHelloWorld"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="24sp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
        
</androidx.constraintlayout.widget.ConstraintLayout>

2. 使用现代布局属性

  • 使用 StartEnd 替代 LeftRight
    • 更好地支持从右到左(RTL)的布局语言,如阿拉伯语和希伯来语。
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"

3. 了解窗口插图和系统栏

  • 窗口插图(Window Insets)

    • 用于处理系统栏(如状态栏和导航栏)与应用内容之间的间距,确保内容不会被系统栏遮挡。
  • WindowInsetsCompat

    • 提供了一种兼容性更好的方式来处理不同版本Android系统上的窗口插图。

4. 深入学习相关组件

  • AppCompatActivity

    • 提供了对旧版Android特性的向后兼容支持,是构建现代Android应用的重要基类。
  • ViewCompat

    • 提供了一系列兼容性方法,帮助在不同版本Android系统上保持一致的行为。
  • ConstraintLayout

    • 强大的布局管理器,允许灵活地定位和调整子视图。

常见问题解答

问题1:enableEdgeToEdge() 无法识别

  • 原因

    • enableEdgeToEdgeandroidx.activity 包中的扩展函数,可能由于依赖项未正确引入导致无法识别。
  • 解决方案

    • 确保在 build.gradle 文件中引入了最新的 androidx.activity 依赖项。

    示例

dependencies {
    implementation("androidx.activity:activity-ktx:1.7.2")  // 使用最新版本
    // 其他依赖项
}
  • 同步Gradle后,重新构建项目。

问题2:如何自定义边缘到边缘显示的行为?

  • 解释

    • enableEdgeToEdge 提供了基本的边缘到边缘显示支持。要进一步自定义,可以通过设置系统栏的颜色、透明度等属性,或使用 WindowInsets 来动态调整内容布局。
  • 示例

window.statusBarColor = Color.TRANSPARENT.toArgb()
window.navigationBarColor = Color.TRANSPARENT.toArgb()


WindowCompat.setDecorFitsSystemWindows(window, false)

问题3:如何确保窗口插图正确应用到所有视图?

  • 解释

    • 确保在布局文件中根布局设置了 android:fitsSystemWindows="false",并在代码中通过 ViewCompat.setOnApplyWindowInsetsListener 监听并调整视图的内边距。
  • 示例

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="false"
    tools:context=".MainActivity">
    
    <!-- 子视图 -->
    
</androidx.constraintlayout.widget.ConstraintLayout>

进一步学习资源


标签:androidx,插图,activity,视图,MainActivity,Studio,kt,import,main
From: https://blog.csdn.net/weixin_41644568/article/details/142752613

相关文章

  • Rstudio占用内存过大
    在R中,尤其是在使用RStudio时,如果数据集很大,全部加载到内存可能会导致内存不足的问题。为了优化内存使用,可以考虑以下几种加载策略:1.按需加载数据使用data.table或dplyr包的功能,可以按需加载数据,而不是将整个数据集加载到内存中。例如,可以使用fread()函数从CSV文件......
  • 怎么手动在rstudio中释放内存?
    在RStudio中手动释放内存的几种方法如下:1.使用gc()函数R提供了gc()函数,可以用来强制R进行垃圾回收,从而释放未使用的内存。可以在R控制台中输入:gc()2.清除对象如果有不再需要的对象,可以使用rm()函数删除它们,并随后调用gc()函数。例如:#删除特定对象rm(obj......
  • Android Studio启动项目下载gradle失败的问题
    解决AndroidStudio项目初始化下载gradle过慢问题解决方法将谷歌官方源替换为国内阿里云或者腾讯云源解决方案替换掉谷歌原地址:官网地址:https://services.gradle.org/distributions/阿里云镜像Gradle下载地址:https://mirrors.aliyun.com/macports/distfiles/gradle/腾讯......
  • TikTok如何进行实时翻译?
    在当今的数字时代,社交媒体平台已然成为连接人与人关系的重要纽带,更是在全球范围内大力推动着跨文化交流。其中,TikTok作为一款风靡全球的社交应用,凭借其丰富多样的内容以及先进的技术,为用户带来了极大的便利。TikTok的即时翻译功能在促进语言交流方面发挥着关键作用。有了这......
  • Visual Studio Code (VS Code) 设置自动保存功能
    在VisualStudioCode(VSCode)中设置自动保存功能非常简单,你可以按照以下步骤进行:打开VSCode。点击左侧的“活动栏”上的“管理”图标(通常是一个齿轮形状的图标)在设置界面,你可以直接搜索“自动保存”选项。在“自动保存”选项中,你可以选择以下几种模式:after......
  • 【海外SRC赏金挖掘】拿下TikTok:从xss到任意用户接管!!
    海外SRC赏金挖掘专栏在学习SRC,漏洞挖掘,外网打点,渗透测试,攻防打点等的过程中,我很喜欢看一些国外的漏洞报告,总能通过国外的赏金大牛,黑客分享中学习到很多东西,有的是一些新的信息收集方式,又或者是一些骚思路,骚姿势,又或者是苛刻环境的漏洞利用。于是我打算开启这个专栏,将我认为......
  • 在Visual Studio Code中运行Llama 3模型
    最近想试试使用Meta发布的最新的开源语言模型Llama3。我选择下载这个模型,并在自己的电脑上运行。第1步:下载并安装首先,访问Ollama网站,下载最新版本的安装程序。Ollama是一个多功能工具,旨在帮助用户在不同平台上本地运行、创建和分享大型语言模型(LLMs)。完成Ollama的安装后,确......
  • 华为云应用侧Android Studio开发
    本文将介绍如何使用AndroidStudio开发APP完成与接入华为云IoTDA设备的对接,包括属性参数获以及取命令下发。一、鉴权认证应用侧需要通过IAM服务鉴权,获取token,华为账号创建IAM用户,可以为创建的用户分配权限认证鉴权_设备接入IoTDA_华为云1.创建IAM账户在统一身份认证......
  • HACKTHEBOX——Lame
    靶机详情靶机地址:10.10.10.3攻击地址:10.10.14.10端口服务扫描先确认kali是否与靶机互通接下来使用nmap或者其他工具扫描一下靶机开放了哪些端口以及服务渗透过程根据htb中的flag提示完成前两个任务第三个任务提示VSFTPd2.3.4存在一个著名的后门,尝试使用ms......
  • #HACKTHEBOX——Driver
    靶机详情靶机地址:10.10.11.106kali地址:10.10.16.4初始侦察与渗透确认kali与靶机之间可以ping通使用nmap进行侦查扫描nmap-sT--min-rate1000-p-10.10.11.106 #以TCP协议,基于当前网络情况,以最低1000的速率进行该IP的全部端口nmap-sT-sC-sV-p80,135,445,598......