Activity是什么
它是用户界面的组件,用于交互。HelloWorld里自动生成了MainActivity,这里我们自己建立一个。
这次建立一个没有Activity的空项目。
我们打开AS,创建新项目,选择No Activity。
下一步和完成。
这次需要手动来添加一个Activity。
添加新的Activity
如上图,我们再java\com.example.newactivity点右键,创建一个Empty Activity。
我们写好名字,不要勾选Layout和Launcher选项,我们后面为了熟悉它,手动添加,点击完成。
添加新的Layout
再res目录下,因为还没有Layout,所以目录都没有,我们手动创建一个。
然后在目录上右键添加Layout Resource File。
点击OK后。
我们可以看到layout的设计视图,点击code可以切换到代码视图。Split是一半设计视图,一半code视图。
我们拖动一个按钮到视图上,Code里也多了响应的代码。和网页前端IDE操作类似。
这里的ID需要注意,我们看按钮的id=@+id/button2,这里的@是不是就是引用value,这里加了+号,所以就没有引用,如果需要引用就除掉+号。
加载调用布局
最后在Activity的OnCreate函数里加载布局。
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_layout)
}
}
这里R表示资源文件,我们添加的所有资源都会在R文件种生成一个相应的资源ID。
注册Activity和设置主Activity
所有的Activity注册了才可以使用,我们打开AndroidManifest,能看到它自动帮我们注册了。
老版本的AS需要自己来添加,新的版本已经都替我们做好了。
接下来,我们要设置主Activity。
<activity android:name=".FirstActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
这里要注意,如果你没有设置主Activity,程序是可以安装,只是无法看到或者打开,可以作为其他应用来调用。
运行
在Activity中使用toast
toast是安卓系统提供的提示方式,一般一些短小的信息提示通知给用户,一段时间后消失。
我们给按钮上添加点击事件,触发toast。
代码如下:
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_layout)
val btn :Button = findViewById(R.id.button2)
btn.setOnClickListener(){
Toast.makeText(this,"点击了按钮!",Toast.LENGTH_SHORT).show()
}
}
}
运行后:
当我们点击按钮后,出现了toast提示。
viewBind
到这里还需要了解一种更便捷的写法,我们每次都要通过findViewById去获得组件,其实AS提供了一种更简单的办法。利用viewBind
首先我们要添加viewBinding到项目的build.gradle文件的android节点下。
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
compileSdk 32
buildFeatures {
viewBinding true
}
defaultConfig {
applicationId "com.example.newactivity"
minSdk 21
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'com.google.android.material:material:1.6.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
gradle变动后要点击同步一次,否则不会生效的。
完毕后,Layout就会生成一个布局java文件,我们代码中就可以比较方便的使用这些组件了。
然后我们回到代码,我们看看如何简便了。
package com.example.newactivity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.Toast
import com.example.newactivity.databinding.FirstLayoutBinding
class FirstActivity : AppCompatActivity() {
protected lateinit var binding : FirstLayoutBinding //定义全局的,方便别的函数使用
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//setContentView(R.layout.first_layout)
// val button1 :Button = findViewById(R.id.button1)
// button1.setOnClickListener(){
// Toast.makeText(this,"点击了按钮!",Toast.LENGTH_SHORT).show()
// }
// button1.text = "test"
binding = FirstLayoutBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view.rootView)
binding.button1.setOnClickListener(){
Toast.makeText(this,"点击了按钮!",Toast.LENGTH_SHORT).show()
}
Log.d("t","ok")
}
}
首先我们定义了全局的binding变量,方便其他函数调用,并且是lateinit,看名字就知道是等下初始化。
然后通过FirstLayoutBinding.inflate(layoutInflater)获得binding,并且把rootView传递给setContentView,这一步很重要。
然后这个layout下的组件都可以使用binding.来获得了。
关于viewBind可以参考官网说明。
Menu
我们在res目录下创建menu文件夹,然后鼠标右键点击main文件夹创建Menu资源。
并添加两个按钮,如下:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id ="@+id/add_item"
android:title="Add" />
<item android:id ="@+id/remove_item"
android:title="Remove" />
</menu>
然后回到Activity脚本,需要重写onCreateOptionsMenu()方法。
我们在脚本中按Ctrl+o,可以快捷简便的找到要覆写的方法。
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main,menu)
return true
}
我们运行起来后就可以看到Menu了(3个点的位置)
接下来要让菜单里这两个按钮生效,我们需要覆写另外一个方法
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item.itemId)
{
R.id.add_item -> Toast.makeText(this,"Click Add !",Toast.LENGTH_SHORT).show()
R.id.remove_item -> Toast.makeText(this,"Click Remove !",Toast.LENGTH_SHORT).show()
}
return true
}
我们再次运行,点击菜单中的Add和Remove,可以看到已经生效了。
Activity的销毁
只要调用finish()方法就可以了,和按下Back按键是一样的。可以把之间的Button改成调用finish实验一下。
binding.button1.setOnClickListener(){
Toast.makeText(this,"点击了按钮!",Toast.LENGTH_SHORT).show()
finish()
运行后:
Activity的内容比较多,本章就到这里,后面再继续Activity。
参考
《第一行代码》Android第三版