欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Activity间数据的传输-android-kotlin

程序员文章站 2024-02-11 00:02:28
...

码字不易,且看且珍惜QAQ

向下一个Activity传递数据

Intent在启动Activity的时候还可以传递数据

思路很简单,可以把我们想要传递的数据暂存在Intent中,在启动另一个Activity后,只需要把这些数据从Intent中取出来就行了。

比如在FirstActivity中有一个按钮,我们想通过这个按钮将字符串"CUMT"传入SecondActivity

那么就可以使用putExtra()方法向Intent对象中暂存数据

button.setOnClickListener{
    val intent = Intent(this,SecondActivity::class.java)
    intent.putExtra("key","CUMT")//向intent中传递键值对 key--1024
    startActivity(intent)
}

再在SecondActivity中利用getStringExtra()方法将暂存的数据取出来

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.second_layout)
        //取出对应键的值,存放到extraData变量中
        val extraData = intent.getStringExtra("key")
        Log.d("SecondActivity","$extraData 已经被取出")
    }
}

由于我们传递的是字符串,所以使用getStringExtra()方法来获取数据。
如果传递的是整型数据,则使用getIntExtra()方法。
如果传递的是布尔型数据,则使用getBooleanExtra()方法。

返回数据给上一个Activity

如果要通过SecondActivity将数据传回FirstActivity,那么就要用startActivityForResult()方法来替代startActivity()方法。

startActivityForResult()方法期望在Activity销毁的时候能返回一个数据给上一个Activity

那么我们就需要在FirstActivity中修改启动下一个Activity的方式:

button.setOnClickListener{
    val intent1 = Intent(this,SecondActivity::class.java)
    //使用startActivityForResult()来启动SecondActivity
    startActivityForResult(intent1,1)
}

startActivityForResult()方法接收两个参数:
第一个参数还是Intent对象;
第二个参数是请求码,用于在之后的回调中判断数据的来源
请求码只要是唯一值即可

然后在SecondActivity中创建一个用于传输数据的Intent对象,并将此对象传递到上一个Activity,所有操作在按钮被点击后执行。

button2.setOnClickListener{
    //创建一个用来存储返回数据的intent
    val intent2 = Intent()
    intent2.putExtra("key","CUMT")
    //将存储着数据的Intent对象返回到上级Activity
    setResult(Activity.RESULT_OK,intent)
    //销毁Activity
    finish()
}

setResult()方法专门用于向上一个Activity传递数据。
第一个参数用于返回处理结果,一般使用RESULT_OKRESULT_CANCELED两个值。
第二个参数则把带有数据的Intent对象传递回去。

接下来我们还需要重写FirstActivity中的onActivityResult()方法来得到SecondActivity返回的数据

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    when(requestCode){
        1->if(resultCode== Activity.RESULT_OK){
            val returnedData = data?.getStringExtra("key")
            Log.d("FirstActivity","获取的数据为$returnedData")
        }
    }
}

?.运算符,只有当data不为null的时候才会调用getStringExtra()方法

如果用户在SecondActivity中并不是通过点击按钮返回的,而是通过系统的返回键返回。

若想在这种情况下依然返回数据,则需要重写SecondActivityonBackPressed()方法来解决这个问题:

override fun onBackPressed() {
    super.onBackPressed()
    //用于存储返回的数据
    val intent = Intent()
    intent.putExtra("key","CUMT")
    //将存储数据的intent返回
    setResult(Activity.RESULT_OK,intent)
    //销毁Activity
    finish()
}