一、Menu 和 Intent 的使用
1.Activity布局文件
(1)仅提供一个按钮用于跳转界面
2.menu资源文件(res/menu/topbar_menu.xml)
(1)简单的menu布局
3.代码文件
package demo.yc.firstcodedemo
import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.Menu
import android.view.MenuItem
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_second.*
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
startActivityBtn.setOnClickListener { // 1
val intent = Intent(this,MainActivity::class.java) // 2,3,4
startActivity(intent)
}
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.topbar_menu, menu) // 5
return true
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item?.itemId) { // 6
R.id.add_item ->
Toast.makeText(this, "add", Toast.LENGTH_SHORT).show()
R.id.delete_item ->
Toast.makeText(this, "delete", Toast.LENGTH_SHORT).show()
}
return true
}
}
(1)按钮点击事件,上一篇已经解释过了
(2)val 修饰的是一个不可变的变量,类似java的final 修饰。var则表示可变的变量,类似java的普通变量
(3)kotlin创建对象不再需要new,看起来就像直接调用构造函数一样,并且new 在kotlin已经不是关键字了,可以作为变量名使用
(4)MainActivity.class 变成MainActivity::class.java
(5)根据menu资源文件,创建对应的菜单
(6)在分支结构中,kotlin已经移除了switch-case写法
二、分支结构
1.if分支
(1)if分支的使用方法和java基本一致
private fun testIf(currentNum: Int) {
if (currentNum >= 10) // 分支中只有一条语句时,花括号可以省略
{
Toast.makeText(
this, "当前数值大于等于10"
, Toast.LENGTH_SHORT).show()
}
else {
Toast.makeText(
this, "当前数值小于10"
, Toast.LENGTH_SHORT
).show()
}
}
2.if表达式
(1)表达式的最终结果是有返回值的,因此if表达式可以返回值
private fun testIfExpress(currentNum: Int) {
val result = if (currentNum >= 10) // 这种写法比上述分支更简洁
{
"当前数值大于等于10" // 默认最后一条语句作为返回值,不带return
}
else {
"当前数值小于10"
}
Toast.makeText(this,result,Toast.LENGTH_SHORT).show()
}
3.when分支
(1)when分支替换了switch-case分支
private fun testWhen(curScore: Char) {
when (curScore) {
'A' -> { // case中的:直接用->替代
Toast.makeText(
this, "优秀"
, Toast.LENGTH_SHORT
).show()
}
'B' -> {
Toast.makeText(
this, "良好"
, Toast.LENGTH_SHORT
).show()
}
'C' -> {
Toast.makeText(
this, "及格"
, Toast.LENGTH_SHORT
).show()
}
'D' -> {
Toast.makeText(
this, "不及格"
, Toast.LENGTH_SHORT
).show()
}
else -> { // 替代default,含义更加清晰
Toast.makeText(
this, "输入有误"
, Toast.LENGTH_SHORT
).show()
}
}
}
4.when表达式
(1)和if表达式一致,when表达式也是可以返回值的
private fun testWhenExpress(curScore: Char) {
val result = when (curScore) {
'A' -> "优秀"
'B' -> "良好"
'C' -> "及格"
'D' -> "不及格"
else -> "输入有误"
}
Toast.makeText(this, result, Toast.LENGTH_SHORT).show()
}
5.强大的when
(1)when 分支表达式
private fun testWhenExpress2(curScore: Int) {
val result = when (curScore) {
in 91..100 -> "优秀" // 分支检查可以是一个表达式
in 70..89 -> "良好" // 以前的case 只能是常量
in 60..69 -> "及格" // in a..b 是kotlin中的区间范围表达式
in 0..59 -> "不及格"
else -> "输入有误"
}
Toast.makeText(this, result, Toast.LENGTH_SHORT).show()
}
private fun testWhenExpress3(curScore: Char) {
val result = when (curScore) {
'A','B' -> "好" // 多个分散的值也可以匹配
'C','D' -> "中"
else -> "输入有误"
}
Toast.makeText(this, result, Toast.LENGTH_SHORT).show()
}
(2)省略when()中的判定值
private fun testWhenExpress4(curScore: String) {
val result = when // when括号已经省略
{ // 只要某分支表达式结果为true,即进入该分支
curScore.contains("A") -> "优秀"
curScore.contains("B") -> "良好"
curScore.contains("C") -> "及格"
curScore.contains("D") -> "不及格"
else -> "输入有误"
}
Toast.makeText(this, result, Toast.LENGTH_SHORT).show()
}
三、Intent跳转,获取当前Activity.this
1.上一篇介绍到,button的点击事件写法有5种,那么每一种都可以实现Intent跳转的逻辑,而问题就是如何在不同的点击事件写法中,获取当前Activity.this,以文中的SecondActivity为例
(1)匿名内部类,非静态内部类实现接口两种写法,可以利用this@SecondActivity
(2)onClick属性绑定,Activity实现点击接口,Lambda表达式,可以直接利用this
(3)通用的一种方式,将当前的Activiy作为成员变量即可
class SecondActivity : AppCompatActivity() {
// kotlin 声明一个变量需要进行初始化,因此这里先初始化为null
// 因为初始化为null,即表示该变量可空,因此需要用?修饰
var curInstance : SecondActivity? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
curInstance = this
startActivityBtn.setOnClickListener(object : View.OnClickListener {
override fun onClick(p0: View?) {
val intent = Intent(curInstance, MainActivity::class.java)
startActivity(intent)
}
})
}
}