Android开发基础——Activity基本用法

什么是Activity

Activity是一种可以包含用户界面的组件,主要用于和用户进行交互。

一个应用程序中可以包含零个或多个Activity,但不包含任何Activity的应用程序则很少。

Activity的基本用法

手动创建Activity

这里选择No Activity创建一个新的项目,并将项目命名为ActivityTest,此时会发现app\src\main\java\com\example\activitytest目录是空的,然后在该包下新建Empty Activity,并将之命名为FirstActivity,并不勾选Generate Layout File和Launcher Activity两个选项,即:

上面两个选项的作用为:

Generate Layout File:勾选表示会自动为FirstActivity创建一个对应的布局文件Launcher Activity:勾选表示会自动将FirstActivity设置为当前项目的主Activity

此时Android Studio会自动生成FirstActivity.kt文件,其内容为:

package com.example.activitytest

import androidx.appcompat.app.AppCompatActivity

import android.os.Bundle

class FirstActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

}

}

项目中的任何Activity都应该重写onCreate方法,不过上面的onCreate是自动生成的,可以看到上面自动生成的onCreate方法很简单,就是调用父类的onCreate方法。

创建和加载布局

之前提到,Android程序设计讲究逻辑和视图分离,最好每一个Activity都能够对应一个布局。

而布局则是用来显示界面内容的,这里手动创建一个布局文件。

在app\src\main\res下新建一个目录,命名为layout,然后在layout下新建一个Layout resource file,命名为first_layout,根元素默认选择LinearLayout:

然后便会出现下面的界面:

上图的右上角有Design,Code和Split的选项卡:

Design:表示当前的可视化布局编辑器,此时不仅可以预览当前的布局,还可以通过拖放的方式编辑布局Code:则可以通过XML文件方式编辑布局Split:则可以同时显示两者

其XML文件内容为:

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

之前在创建布局文件时选择了LinearLayout 作为根元素,因此现在布局文件中便存在一个LinearLayout元素。此时添加一个按钮:

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/button1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="Button 1"

/>

上面添加了一个Button元素,并在Button元素内部增加了几个属性:

android:id:是给当前元素定义一个唯一的标识符,之后可以在代码中对该元素进行操作,这正是之前提到的XML文件引用资源的用法,不过多一个+表示定义一个idandroid:layout_width:指定了当前元素的宽度,match_parent表示和父元素一样宽android:layout_height:指定了当前元素的高度,wrap_content表示当前元素的高度只要能刚好包含里面的内容就可以android:text:指定了元素中显示的文字内容

从预览中可以看出,该按钮已经添加成功,然后在Activity中加载该布局:

package com.example.activitytest

import androidx.appcompat.app.AppCompatActivity

import android.os.Bundle

class FirstActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.first_layout)

}

}

可以看到,这里调用了setContentView方法来给当前的Activity加载一个布局,而在该方法中一般需要传入一个id。之前提到,项目中添加的任何资源都会在R文件中生成一个相应的资源id,这里传入的就是first_layout的id。

在AndroidManifest文件中注册

之前提到,所有的Activity都要在AndroidManifest.xml中注册才能够生效。实际上FirstActivity已经在AndroidManifest中注册过了:

package="com.example.activitytest">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:roundIcon="@mipmap/ic_launcher_round"

android:supportsRtl="true"

android:theme="@style/Theme.ActivityTest">

android:name=".FirstActivity"

android:exported="true" />

从上面文件内容可以看出,Activity的注册声明位于application标签内,这里是通过activity标签来对Activity进行注册的,不过注册过程是Android Studio自动完成的。

而在activity标签中:

android:name:指定了具体注册哪一个Activity,这里的.FirstActivity是com.example.activitytest.FirstActivity的缩写,由于在最外层的manifest标签中已经通过package属性指定了程序的包名com.example.activitytest,因此在注册Acitvity时,这一部分可以省略,直接使用.FirstActivity

不过上面只是注册了Activity,程序仍然不能运行,因为还没有为程序配置主Activity,即程序运行起来的时候,不知道要先启动哪个Activity。而配置主Activity的方法就是在activity标签内部添加以下内容:

此外,还可以使用android:label指定Activity中标题栏的内容,标题栏是显示在Activity最顶部的。同时给主Activity指定的label不仅会生成标题栏中的内容,还会称为启动器(Launcher)中应用程序显示的名称。

package="com.example.activitytest">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:roundIcon="@mipmap/ic_launcher_round"

android:supportsRtl="true"

android:theme="@style/Theme.ActivityTest">

android:name=".FirstActivity"

android:label="This is FirstActivity"

android:exported="true">

此时,FirstActivity就称为该程序的主Activity了,点击桌面应用程序图标时首先打开的就是该Activity。不过,如果应用程序中没有声明任何一个Activity作为主Activity,该程序仍然是可以正常安装的,只是无法在启动器中看到或者打开该程序,此类程序一般是作为第三方服务供其它应用在内部进行调用的。

此时运行程序的结果为:

在Activity中使用Toast

Toast是Android系统提供的一种很好的提醒方式,在程序中可以使用Toast将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间。

首先需要定义一个弹出Toast的触发点,之前定义了一个按钮,这里可以使用该按钮的点击事件作为弹出Toast的触发点。此时需要在onCreate方法中添加代码:

package com.example.activitytest

import androidx.appcompat.app.AppCompatActivity

import android.os.Bundle

import android.widget.Button

import android.widget.Toast

class FirstActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.first_layout)

val button1: Button = findViewById