Activity间数据的传输-android-kotlin

码字不易,且看且珍惜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()
}

猜你喜欢

转载自blog.csdn.net/qq_15989473/article/details/106842823