Android中返回数据给上一个Activity
第一种方式:startActivityForResult
创建两个Activity:MainActivity、SecondActivity
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val mainButton = binding.mainButton
mainButton.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java);
this.startActivityForResult(intent, 10)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
10 -> if (resultCode == RESULT_OK) {
val name = data?.getStringExtra("name")
Log.d("MainActivity", "name: $name")
}
}//when
}
}
startActivityForResult方法接收两个参数,第一个参数是Intent;第二个参数是请求码,用于在之后的回调函数onActivityResult中判断数据来源。这里我们使用了startActivityForResult方法启动了SecondActivity,请求码只要是一个唯一值即可,这里传入了10。
onActivityResult方法中带有3个参数:第一个参数requestCode,即我们在启动SecodeActivity时传入的请求码;第二个参数resultCode,即SecondActivity在返回数据时的处理结果;第三个参数data,即携带着返回数据的Intent。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/mainButton" android:text="to_second_activity" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
SecondActivity.kt
class SecondActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = ActivitySecondBinding.inflate(layoutInflater) setContentView(binding.root) binding.secondButton.setOnClickListener { val intent = Intent() intent.putExtra("name", "Bin Shi") setResult(RESULT_OK, intent) finish() } } }
可以看到在SecondActivity类里,按钮点击事件中我们构建了一个Intent,只不过这个Intent仅仅用于传递数据而已,它没有指定任何的意图。其中关键代码是调用了setResult方法,该方法用于向上一个Activity返回数据。setResult方法接收两个参数,第一个参数用于向上一个Activity返回处理结果,一般只是用RESULT_OK或者RESULT_CANCELED这两个值;第二个参数则把有数据的Intent传递回去。最后调用了finish方法来销毁当前Activity。
activity_second.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".SecondActivity"> <Button android:id="@+id/secondButton" android:text="to_main_activity" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
由于在一个Activity中有可能调用startActivityForResult方法启动多个不同的Activity,每一个Activity返回的数据都会调用到onActivityResult这个方法,因此我们首先要做的就是通过检查requestCode的值来判断数据来源,然后做对应的业务处理。
注:startActivityForResult和onActivityResult在较新版本中已经被标记为Deprecated(废弃;不建议使用),接下来介绍谷歌推荐使用的新方案。
第二种方式:registerForActivityResult
只需要修改MainActivity中的代码即可
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val mainButton = binding.mainButton
val register = registerForActivityResult(
ActivityResultContracts.StartActivityForResult(),
ActivityResultCallback {
if (it.resultCode == RESULT_OK) {
Log.d("MainActivity", "resultCode: ${it.resultCode}")
Log.d("MainActivity", "name: ${it.data?.getStringExtra("name")}")
}
}
)
mainButton.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java);
register.launch(intent)
}
}
}
这里只是展示了registerForActivityResult最简单的用法,registerForActivityResult方法会返回一个ActivityResultLauncher对象,该对象必须在Activity started之前调用,不然会报错,然后调用launch方法就可以实现Activity跳转,这里SecondActivity不要做任何改动。
OK,这篇就到这里!更多registerForActivityResult的用法可以参考:https://blog.csdn.net/Ikulm/article/details/119798336 或者官网等其他文章。
posted on 2023-05-21 20:55 Devil'soul 阅读(809) 评论(0) 编辑 收藏 举报