实现活动之间的交互,并返回上个活动,传统的方法是利用startActivityForResult启动活动,并在onActivityResult函数中处理返回上一个活动的数据及其他的处理。具体代码的做法如下:
class MainActivity : AppCompatActivity() {
lateinit var binding:ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.firstBtn.setOnClickListener {
turnTo(FirstActivity::class.java,1) //跳转到FirstActivity活动
}
binding.secondBtn.setOnClickListener {
turnTo(SecondActivity::class.java,2) //跳转到SecondActivity活动
}
}
private fun <T> turnTo(c:Class<T>,requestCode:Int){
val intent = Intent(MainActivity@this,c) //定义意图
startActivityForResult(intent,requestCode) //启动活动,设置请求码
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(resultCode== Activity.RESULT_OK){
when(requestCode){
1->{ //从FirstActivity返回
val receivedData = data?.getStringExtra("info")
Toast.makeText(MainActivity@this,"接收:$receivedData",
Toast.LENGTH_LONG).show()
}
2->{ //从SecondActivity返回
Toast.makeText(MainActivity@this, resources.getString(R.string.title_frm_second),
Toast.LENGTH_LONG).show()
}
}
}
}
}
但是,appcompat库升级到1.3.0或更高的版本,中这种处理方式已经不支持使用了。原因是官方建议使用Activity Result API. 在新的版本下,活动之间交互,并同时需要返回上一个活动,这时代码调整为:
在上一个活动中,代码类似:
class MainActivity : AppCompatActivity() {
lateinit var resultLauncher: ActivityResultLauncher<Intent>
lateinit var binding:ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
resultLauncher =registerForActivityResult(
ActivityResultContracts.StartActivityForResult(),
ActivityResultCallback {
if(it.resultCode== Activity.RESULT_OK){
Toast.makeText(MainActivity@this,
it.data?.getStringExtra("FrmInfo"),
Toast.LENGTH_LONG).show()
}
})
binding.firstBtn.setOnClickListener {
turnActivity(FirstActivity::class.java,"To FirstActivity")
//跳转到FirstActivity活动
}
binding.secondBtn.setOnClickListener {
turnTo(SecondActivity::class.java,"To SecondActivity")
//跳转到SecondActivity活动
}
}
private fun<T> turnActivity(c:Class<T>,info:String){
//跳转到下一个活动
val intent = Intent(this,c)
intent.putExtra("DATA",info)
resultLauncher.launch(intent)**
}
}
registerForActivityResult()活动结果注册回调函数接收两个参数:
(1)第一个参数:是Contract类型,定义生成结果所需的输入类型以及结果的输出类型。这些 API 可为拍照和请求权限等基本 intent 操作提供默认协定。它的作用在于从另外一个Activity中请求数据;
(2)第二个参数:是ActivityResultCallback,是单一方法接口,带有 onActivityResult() 方法,可接受 ActivityResultContract 中定义的输出类型的对象,表示成一个Lambda表达式,当有结果返回时则会回调到这里,在此处获取并处理数据。
在跳转的活动中,代码类似:
class FirstActivity : AppCompatActivity() {
lateinit var binding:ActivityFirstBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityFirstBinding.inflate(layoutInflater)
//接收从MainActivity发送的数据
binding.firstTxt.text = intent.getStringExtra("DATA")
binding.returnBtn.setOnClickListener {
//返回上一个活动MainActivity
val intent = Intent()
intent.putExtra("FrmInfo","FirstActivity返回MainActivity")
setResult(Activity.RESULT_OK,intent)
finish()
}
setContentView(binding.root)
}
}
参考文献:
“获取 activity 的结果”
https://developer.android.google.cn/training/basics/intents/result?hl=zh-cn
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/195563.html