本教程使用的环境:Android studio
本教程使用的编程语言:kotlin
本教程的学习难度:前期教程适合新手入门学习,后续会逐步提升难度。
在上一课程中,我们学习了新建工程,其中就有Activity的创建,首先抛开更为基础的文件工程介绍和基本控件的介绍,在未来的课程我会逐步把用到的知识加入到课程中来,所以本节我们继续学习Activity。大概包含三部分:
1、了解Activity的基本用法
2、Android studio控件的使用
3、menu菜单的使用
一、Activity的生命周期
Activity共计7个回调函数,在它的生命周期中每一个环节执行着各自的职责。分别为:
onCreate()
onStart()
onResume()
onPause()
onRestart()
onStop()
onDestroy()
用流程图来展示一下生命期的执行过程:
在此,我们需要了解返回栈这个概念。Android是使用任务( Task )来管理活动的,一个任务就是一组存放在栈里的活动的集台,这个栈也被称作返回栈( Back Stack )。栈是一种后进先出的数据结构。当Activity处于onResume状态的时候。它是位于返回栈的栈顶,已经可以与用户交互。
二、Activity的跳转
2.1 创建新的Activity,
命名为FirstActivity「因为第一个为MainActivity,命名是任意的,大家随意」,此时需要注意,不要勾选Launcher Activity选项,需要勾选Generate Layout FIle选项。
2.2 添加基础控件
我们在activity_main.xml中利用所见即所得「Design模式」拖动1个TextView和2个Button控件到界面上,然后切换到xml的「code模式」修改代码。
<?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"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="266dp"
android:layout_height="188dp"
android:text="Hello World!"
android:gravity="center"
tools:layout_editor_absoluteX="78dp"
tools:layout_editor_absoluteY="54dp" />
<Button
android:id="@+id/btn_tiaozhuan1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转1"
tools:layout_editor_absoluteX="78dp"
tools:layout_editor_absoluteY="341dp" />
<Button
android:id="@+id/btn_tiaozhuan2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转2"
tools:layout_editor_absoluteX="247dp"
tools:layout_editor_absoluteY="341dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
同样:在activity_first.xml中添加一个Button,并且修改代码
<?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"
tools:context=".FirstActivity">
<Button
android:id="@+id/btn_fanhui"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="返回"
tools:layout_editor_absoluteX="155dp"
tools:layout_editor_absoluteY="216dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
此时我们运行下app会发现如下问题,控件都堆积在左上角。无法展示如上图的效果。因为我们使用的是约束布局,所以需要设置控件之间的约束关系「更多布局方式未来详细介绍」。
此处,我们简单设计下,让控件能够正常显示即可,不要把时间浪费在设计外观上。
2.3 增加控件之间的约束方式
下图蓝色部分,当我们选中TV控件的时候,四边出现了小圆圈,拉动小圆圈,让它依次连接到整个视图的边,然后再把tv控件拖动到合适的位置,然后相同的办法把bt控件处理好即可。
或者点击属性:
依次点击4个+位置也能够达到相同效果:
2.4 实现Button控件的点击事件
在设计控件的时候,我们给每个控件都增加了一个属性:android:id="@+id/***,它是我们能够找到它的一个标识,通过findViewById()方法找到它。下面通过代码直接展示:
FirstActivity.kt
package com.example.myapplication
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_first)
val btn_fanhui: Button = findViewById(R.id.btn_fanhui)
// 点击事件中调用finish结束activity
btn_fanhui.setOnClickListener {
finish()
}
}
}
MainActivity.kt
package com.example.myapplication
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.view.View.OnClickListener
import android.widget.Button
class MainActivity : AppCompatActivity(),OnClickListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 进行实例化的2种方式,
//val btn_tiaozhuan1:Button = findViewById(R.id.btn_tiaozhuan1)
val btn_tiaozhuan1 = findViewById<Button>(R.id.btn_tiaozhuan1)
// 点击事件的第1种使用方式,直接写在setOnClickListener
btn_tiaozhuan1.setOnClickListener {
// Activity的跳转。借助Intent
startActivity(Intent(this,FirstActivity::class.java))
}
// 点击事件的第2种使用方式,需要继承View.OnClickListener,然后复写onClick函数
findViewById<Button>(R.id.btn_tiaozhuan2).setOnClickListener(this)
}
// 复写onClick函数
override fun onClick(v: View?) {
// Activity的跳转。借助Intent
startActivity(Intent(this,FirstActivity::class.java))
}
}
运行起来看最终效果:
三、Menu菜单的使用
屏幕毕竟有限,当按钮和页面跳转的需求较多时,就会导致界面显得很凌乱,此时我们就需要一个集合来实现。Android的菜单有三种,选项菜单(Option Menu)是其中之一。
3.1 创建资源文件夹
目录res--layout--menu
3.2 创建menu文件
设计main.xml包含3个按键
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/item1"
android:title="保存">
</item>
<item
android:id="@+id/item2"
android:title="删除">
</item>
<item
android:id="@+id/item3"
android:title="取消">
</item>
</menu>
3.3 复写相应的方法
在MainActivity.kt里面复写onCreateOptionsMenu()方法,
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main,menu)
return true
}
如果我们需要捕捉menu菜单里面的事件,还需要复写onOptionsItemSelected()方法
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.item1 -> Toast.makeText(this,"点击了保存按钮", Toast.LENGTH_SHORT).show()
R.id.item2 -> Toast.makeText(this,"点击了删除按钮", Toast.LENGTH_SHORT).show()
R.id.item3 -> Toast.makeText(this,"点击了取消按钮", Toast.LENGTH_SHORT).show()
}
return true
}