用 AS 新建工程,默认生成一个 MainActivity 。
在原来的工程上新建一个 Activity ,创建并加载布局,再学下点击事件、弹出Toast 、页面跳转、创建 menu 菜单。
1.创建 FirstActivity
在原来的工程上,选中包名,右键 New – Kotlin Class/File ,类型选择 Class ,
创建 FirstActivity ,如下,
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
2.创建并加载布局
在 res/layout 目录下新建一个 activity_first.xml 布局文件,内容很简单,就一个 button ,
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_first"
android:text="first"
android:textColor="@color/colorPrimary"
android:textSize="30sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
修改 FirstActivity ,添加 setContentView() 方法,
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_first)
}
}
3.注册
在 AndroidManifest.xml 中注册,添加一个自定义的 action ,方便隐式启动
<activity android:name=".FirstActivity">
<intent-filter>
<action android:name="android.intent.action.START_FIRST"/>
</intent-filter>
</activity>
4.添加点击事件
java 的写法是先 findViewById() 再 setOnClickListener() ,
Kotlin 中的写法就简洁了,
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_first.* //注释1
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_first)
btn_first.setOnClickListener {
Toast.makeText(this, "click", Toast.LENGTH_SHORT).show()
}
}
}
Kotlin 中,在 app/build.gradle 中,默认引入 kotlin-android-extensions 插件,
apply plugin: 'kotlin-android-extensions'
这个插件会根据布局文件中定义的控件 id 自动生成同名的变量,可以在 Activity 中直接使用,配合 AS 的代码补全,很方便。
注意 注释1 处,要 import 当前 Activity 用的布局文件。
点击事件用 Lambda 表达式。
Toast 写法和 Java 写法一致。
这样,一个新的 Activity 就写好了。
5.intent跳转
进入应用后默认打开的是 MainActivity ,
因为 MainActivity 配置了<action android:name="android.intent.action.MAIN" />
和 android.intent.category.LAUNCHER
,
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.START_KHW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
MainActivity 的布局文件是 activity_main.xml ,给 TextView 加个 id ,
<?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_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
在 MainActivity 中添加 TextView 的点击事件,作用就是用 Intent 打开 FirstActivity ,点击这个TextView ,就可以打开 FirstActivity 了。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textview_main.setOnClickListener {
val intent = Intent(this, FirstActivity::class.java)//注释2
startActivity(intent)
}
}
}
如 注释2 处, FirstActivity::class.java 的写法相当于 Java 中的 FirstActivity.class 。
Intent 的写法和 Java 还是很类似的。
这是显示启动,也可以隐式启动,
val intent = Intent("android.intent.action.START_FIRST")
startActivity(intent)
还记得吗? android.intent.action.START_FIRST 是我们给 FirstActivity 添加的 action 。
6.使用Menu
在 res 文件夹下新建 menu 目录,再在 menu 新建 Menu resource file ,新建了 main_menu.xml 文件,
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/item_1"
android:title="item_1_title"/>
<item android:id="@+id/item_2"
android:title="item_2_title"/>
</menu>
回到 MainActivity 中,重写 onCreateOptionsMenu
和 onOptionsItemSelected
方法,
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
//return super.onCreateOptionsMenu(menu)
menuInflater.inflate(R.menu.main_menu, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
//return super.onOptionsItemSelected(item)
when(item.itemId){
R.id.item_1 -> Toast.makeText(this, "click item 1", Toast.LENGTH_SHORT).show()
R.id.item_2 -> Toast.makeText(this, "click item 2", Toast.LENGTH_SHORT).show()
}
return true
}
完成。