03_kotlin_Menu_Intent

一、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)
            }
        })
    }
}

你可能感兴趣的:(03_kotlin_Menu_Intent)