Activity介绍
1. Activity介绍
闲话:什么是Activity
Activity可以理解为用户界面,用来与用户进行交互,其中包含了用户界面的组件;一个应用程序可以有零个或多个Activity。
1.1 手动创建Activity
新建一个项目,选择Add No Activity,不生成MainActivity,因为我们要自己创建
项目名称随意,我跟着书取ActivityTest
项目创建好后,观察项目结构,并没有像之前创建项目时选择Empty Activity一样生成一个MainActivity文件
右键此包,New一个空Activity
起名为FirstActivity,并把Generate Layout File(生成布局文件)和Launcher Activity(作为启动Activity)去除勾选,因为我们要自己弄
创建完成,并且Android Studio(AS)已经帮我们自动生成了重写onCreate()方法的代码,当然,以后可以根据自己的需要修改里面的逻辑的,毕竟代码是死的人是活的。
1.2 创建和加载布局
Android程序有一个前提就是逻辑和视图分离,类似于前后端的关系,最好一个Activity对应一个布局
在src.main/res目录下New一个layout目录,用来存放布局,然后再此目录下New一个Layout resource file,命名为first_layout,选择线性布局即可,创建完成如图
点击Text进行代码级的编辑,并添加一个Button
前面说过,Activity要对应布局,那么程序不知道啊,我们需要告诉程序first_laytou这个布局是对应FirstActivity的,所以回到FirstActivity中,添加代码如图
在项目中添加任何资源都会在R文件中生成一个相应的资源id,因此我们创建first_layout.xml的时候已经将id添加到R文件中了,所以直接调用R.layout.first_layout即可获取该布局的id传给setContentView()方法
1.3 在AndroidManifest.xml中注册
所有的Activity都需要在A你的肉i的Manifest.xml中注册才行,但是在New好一个Activity时,AS已经被帮我们注册好了,打开AndroidManifest.xml文件,Activity的注册放到了标签内部
注册好了Activity,现在程序还并不能运行,因为没有配置主Activity,程序没有一个入口,所以我们还需要对主Activity进行配置,也是通过标签实现
然后运行试试,选择设备,点击运行
具体操作
1.4 Toast的使用
Toast是一种非常好的提醒方式,使用它可以将一些短小的信息进行通知,一段时间后自动消失,并且不会占用任何屏幕空间
只用Toast首先需要定义一个弹出Toast的触发点,我们试试用按钮的点击事件作为触发点。在onCreate()中写入代码:
val button_1: Button = findViewById(R.id.button_1)
button_1.setOnClickListener {
Toast.makeText(this, "You clicked button_1", Toast.LENGTH_SHORT).show()
}
其中,通过R文件中的button_1这个id获取的到按钮的实例,由于findViewById()方法返回的是一个继承自View的泛型对象,所以Kotlin无法知道他是什么类型,需要我们显示的声明为Button类型,通过调用setOnClickListener()方法注册一个监听器;然后就可以书写Toast的逻辑了,通过调用Toast的静态方法makeText()创建对象,并调用show()方法进行显示,其中makeText()方法需要传入三个参数:
- Context,依旧是Toast要求的上下文,由于Activity本身就是一个Context对象,因此这里直接传入this。
- 文本的内容
- 显示的时长,有两个常量可以选择
Toast.LENGTH_SHORT
和Toast.LENGTH_LONG
重点
用Kotlin编写的Android项目再app/bulid.gradle文件的头部默认引入了kotlin-android-extensions插件,它会根据布局文件中定义的控件id自动生成一个具有相同名称的变量,我们可以直接使用这个变量,而不用再调用findViewById()方法,如图
1.5 Menu的使用
在res目录下新建menu文件夹,在menu文件夹下New一个Menu resource file,取名为main
然后用标签创建两个菜单项
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
回到FirstActivity中,按Ctrl+O,重写onCreateOptionsMenu()方法
然后书写代码
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main, menu)
return true
}
这里需要注意,在Kotlin中,我们调用一个类中的属性时,可以直接调用,而不是通过get、set方法,Kotlin会自动帮助我们替换;所以这里直接调用了menuInflater,实际上是在调用父类的getMenuInflater()方法,Ctrl+左键menuInflater如下图,可以看到确实是到了父类的getMenuInflater()方法。
从图中可以看到,getMenuInflater()返回的是一个MenuInflater对象,所以可以调用其inflate()方法给当前Activity创建菜单;inflate()接收两个参数:
- 指定我们通过哪一个资源文件来创建菜单,这里选择我们写好的res/menu/main文件,即R.menu.main
- 指定我们的菜单项将添加到哪一个Menu对象当中,这里直接使用onCreateOptionsMenu()方法中传入的menu参数
此方法返回值为true,说明菜单允许被显示,false表示不允许被显示。
运行,右上角出现了三个点,点开为菜单
菜单的显示做到了,那菜单还要有一定的功能才行,我们给菜单加上响应事件
在FirstActivity中重写onOptionsItemSelected()方法,这里用一个when语句,传入item.itemId,代码看不懂就看看上面标重点的内容和when的语法。
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item.itemId){
R.id.add_item -> Toast.makeText(this, "You clicked Add",
Toast.LENGTH_SHORT).show()
R.id.remove_item -> Toast.makeText(this, "You clicked Remove",
Toast.LENGTH_SHORT).show()
}
return true
}
运行,点Add就出现Add的Toast,点Remove就是出现Remove的Toast
1.6 销毁一个Activity
Activity类提供了finish()方法,调用此方法可以销毁当前Activity,比如在button的响应事件中加入finish(),那点击按钮就会关闭当前Activity,效果和按Back键是一样的