书籍
《第一行代码 Android》第三版
开发 环境
Android Studio Jellyfish | 2023.3.1
setContentView
android studio自动生成的SecondActivity.kt中自动生成的代码中已经绑定了second_layout.xml的布局资源,通过代码:setContentView(R.layout.second_layout)实现。代码如下:
package com.example.activitytest
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.second_layout)
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
}
}
}
setContentView就是设置一个Activity的显示界面,使用setContentView可以在Activity中动态切换显示的View,这样,不需要多个Activity就可以显示不同的界面,因此不再需要在Activity间传送数据,变量可以直接引用。
setContentView是个多态方法,我们可以先用LayoutInflater把布局xml文件引入成View对象,再通过setContentView(View view)方法来切换视图。因为所有对View的修改都保存在View对象里,所以,当切换回原来的view时,就可以直接显示原来修改后的样子。
增加按钮控件button2
在android studio自动生成的second_layout.xml中添加一个按钮Button2,如下所示:
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 2"
tools:ignore="MissingConstraints" />
最后一句代码tools:ignore="MissingConstraints"的说明可以参考前面的文章button1 <Button>: Missing Constraints in ConstraintLayout-CSDN博客
UI界面切换
要实现在FirstActivity的界面(first_layout.xml)点击一下按钮button1切换到SecondActivity的界面(second_layout.xml界面显示button2按钮控件),那么就需要在button1的按钮点击事件监听中实现界面的切换动作,代码如下:
mainBinding.button1.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
}
这里使用了Intent这个知识,书中有比较详细的讲解,此处不冗余介绍。
private lateinit var mainBinding: FirstLayoutBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_layout)
mainBinding = FirstLayoutBinding.inflate(layoutInflater)
setContentView(mainBinding.root)
mainBinding.button1.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
}
}
问题
在学习3.3 使用Intent在Activity之间穿梭章节的时候,新建了SecondActivity及其对应的布局资源second_layout.xml,并实现从FirstActivity到SecondActivity的切换,我遇到的问题是切换到SecondActivity后,界面的标题和BUTTON 2重叠了.如下图所示:
而书本中的并没有出现这样的情况.
解决方式
经过胡乱测试,发现将SecondActivity.kt中的enableEdgeToEdge()注释后,该问题就解决了。
效果如下所示: