Activity实战

点击事件的写法

  1. Java函数式API
 val button1: Button = findViewById(R.id.button1)
 button1.setOnClickListener{
//DO SOMETHING
}
  1. 实现接口的方式来进行注册,多个按钮的操作,在when那里判断就行
class FirstActivity : AppCompatActivity(), View.OnClickListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.first_layout)
        val button1: Button = findViewById(R.id.button1)
        button1.setOnClickListener(this)

    }
    override fun onClick(v: View?) {
        when(v?.id){
            R.id.button1 ->{
                //Toast.makeText(this, "Clicked button 1", Toast.LENGTH_LONG).show()
                //do something
            }
        }
    }
}

添加menu


<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id = "@+id/add_item"
        android:title="Add"/>
    <item
        android:title="Remove"
        android:id = "@+id/remove_item"/>
menu>

菜单的资源文件,定义菜单项的id和名字。然后在显示菜单的Activity中重写onCreateOptionsMenu()方法。

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.main, menu)
        return true
    }

getMenuInflater()方法能够得到一个MenuInflater对象,再调用它的inflate()方法,就可以给当前Activity创建菜单了。inflate()方法第一个参数是菜单的资源文件,第二个指定将菜单创建在哪一个menu对象中。接下来定义菜单的响应事件,重写onOptionsItemSelected()方法。

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            R.id.add_item->{
                Toast.makeText(this, "clicked ADD", Toast.LENGTH_LONG).show()
            }
            R.id.remove_item->{
                Toast.makeText(this, "clicked Remove", Toast.LENGTH_LONG).show()
            }

        }
        return true
    }

使用item.itemId判断是点击了哪一个菜单项。
关闭布局使用finish()

使用Intent

启动一个Activity

  1. 显示Intent,直接设置需要启动的新Activity,调用startActivity(intent)
        val intent = Intent(this, SecondActivity::class.java)
        startActivity(intent)
  1. 隐式Intent,并不直接指明需要启动的Activity是什么,而是设置action, category等信息,系统去分析这个Intent,并帮我们找出合适的Activity去启动。合适的Activity是指在AndroidManifest.xml标签下配置的内容,可以指定对应Activity能够响应的actioncategory
        <activity
            android:name=".SecondActivity"
            android:exported="false">
            <intent-filter>
                <action android:name="com.example.activitytest.ACTION_START" />
                <category android:name="android.intent.category.DEFAULT" />
            intent-filter>
        activity>

只有中的内容同时匹配Intent中指定的actioncategory时,这个Activity才能响应该Intent。

        val intent = Intent("com.example.activitytest.ACTION_START")
        intent.addCategory("android.intent.category.DEFAULT")
        startActivity(intent)

每个Intent中只能指定一个action,但能指定多个category。目前我们的Intent中只有一个默认的category,调用addCategory()增加,为了响应需要在.xml文件中说明。

向下一个Activity传送数据

为了向启动的Activity传输数据,Intent提供了一系列的putExtra()方法的重载可以把我们想要传递的数据暂存在Intent中,在启动另一个Activity后,只需要把这些数据从Intent中取出就可以了。比如说FirstActivity中有一个字符串,现在想把这个字符串传递到SecondActivity中:

        val intent = Intent("com.example.activitytest.ACTION_START")
        intent.addCategory("android.intent.category.DEFAULT")
        intent.putExtra("extra_data","Hello new Activity")
        startActivity(intent)
class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.second_layout)
        val btn2: Button = findViewById(R.id.button2)
        val extraData = intent.getStringExtra("extra_data")
        btn2.setOnClickListener {
            Toast.makeText(this, extraData, Toast.LENGTH_LONG).show()
        }
    }
}

返回数据给上一个Activity

使用registerForActivityResult方法,具体步骤,在当Activity中创建一个私有变量。
private lateinit var register: ActivityResultLauncher然后在onCreat()函数中添加如下代码:

register = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
            if(it.resultCode == RESULT_OK){
                val resultData = it.data?.getStringExtra("data_return")//获取数据
                Toast.makeText(this, resultData, Toast.LENGTH_LONG).show()
            }else{
                Toast.makeText(this, "Return Wrong", Toast.LENGTH_LONG).show()
            }
        }

按钮启动:

btn.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            register.launch(intent)
        }

在新打开的Activity中通过按键返回:

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.second_layout)
        button2.setOnClickListener{
            val intent = Intent()
            intent.putExtra("data_return", "Hello FirstActivity")
            setResult(RESULT_OK, intent)
            finish()
        }
    }
}

如果不是通过按钮返回而是Back键回到FirstActivity。我们可以通过在SecondActivity中重写onBackPressed()方法来解决这个问题。

    override fun onBackPressed() {
        val intent = Intent()
        intent.putExtra("data_return", "Hello FirstActivity")
        setResult(RESULT_OK, intent)
        finish()
    }

你可能感兴趣的:(Kotlin,kotlin,android,java)