一、Activity组件概述
Activity组件是Android的四大基本组件之一,它的主要功能就是定义界面。大多数应用包含多个屏幕,这意味着它们包含多个Activity。通常,应用中的一个 Activity 会被指定为主Activity,这是用户启动应用时出现的第一个屏幕。然后,每个 Activity 可以启动另一个Activity,以执行不同的操作。 Activity 充当了应用与用户互动的入口点。 Activity提供窗口供应用在其中绘制界面。 一个 Activity 实现应用中的一个屏幕。
二、创建和配置Activity
Activity主要的功能就是定制移动应用的界面。当前,Activity主要有两种方式来定义界面:(1)传统结合XML布局文件定义Activity的界面;(2)谷歌公司主推的Compose工具包定义活动的界面。
2.1 传统结合采用XML布局文件定义活动界面
新建一个Android项目,因为本开发工具采用“Android Studio Giraffe | 2022.3.1 Patch 1”,创建新的项目模块,默认的主活动MainActivity是ComponentActivity的子类,采用支持Compose的界面呈现方式。将原有的MainActivity.kt删除。
因此,创建一个传统结合XML布局文件的活动,可以右击鼠标,在弹出的三级菜单,依次选择New->Activity->Empty Views Activity,如图1所示。
这时会生成一个对应继承AppCompatActivity类的子活动类,例如MainActivity,代码如下:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
自定义MainActivity对应的布局文件,如下所示:
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/design_default_color_secondary"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
定义活动后需要在AndroidManifest.xml文件中配置活动。特别是值得注意地是样式的配置,这是因为
最新的Android Studio默认支持Android JetPack Compose组件,因此默认样式定义格式不匹配,修改配置文件如下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
…… <!-- 省略 -->
android:theme="@style/Theme.AppCompat">
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
注意:上述的主题均将默认的样式修改为:
android:theme = “@style/Theme.AppCompat”
表示与AppCompatActvity子类保持一致。
如果需要对绑定的XML文件进行处理,这时需要获取XML配置的GUI控件,具体的处理方式有两种:
默认的结合findViewById访问GUI控件和利用ViewBinding来访问GUI控件。
(1)默认的结合findViewById访问GUI控件
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) //必须先调用,否则检索控件失败
val textView = findViewById<TextView>(R.id.textView);
textView.setText("Hello Android World") }
}
}
(2)利用viewBinding来访问GUI控件
这需要在项目模块的build.gradle中设置允许使用viewBinding,形如:
android {
…
buildFeatures{
viewBinding true
}
}
这时修改活动MainActivity,代码如下:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
binding.textView.text = "Hello Android World"
setContentView(binding.root)
}
}
运行结果如图2所示:
2.2 采用JetPack Compose组件定义界面
(1)新建一个项目模块。
(2)修改模块的build.gradle,增加允许使用compose的许可,如下所示:
android{
…
buildFeatures{
compose true
}
}
定义主活动MainActivity,代码如下:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Ch03DemoTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = Color(0x03,0xDA,0xC6)
) {
Greeting("Android World")
}
}
}
}
}
@Composable fun Greeting(name: String, modifier: Modifier = Modifier) {
Text(
text = "Hello $name!",
fontSize = 30.sp,
textAlign = TextAlign.Center,
modifier = modifier
)
}
还需要将MainActivity配置在AndroidManifest.xml中。
<application android:theme="@style/Theme.Ch03Demo">
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.Ch03Demo">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
运行结果如图3所示。
参考:
”Jetpack Compose 教程“ https://developer.android.google.cn/jetpack/compose/tutorial?hl=zh-cn