Android笔记(五):结合Compose组件利用ActivityResultLauncher解决多活动跳转返回数据

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。Android笔记(五):结合Compose组件利用ActivityResultLauncher解决多活动跳转返回数据,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

在本人博客中Android活动返回不在再支持startActivityForResult()后的处理方法已经记录采用ActivityResultLauncher来处理多活动的返回并传回数据的方式。但是采用的是布局xml+viewBinding技术。目前,谷歌官方推荐使用JetPack Compose组件来定义界面。在本文中,将介绍在JetPack Compose定义的界面中ActivityResultLauncher的实现不同活动跳转并返回数据。
例:从MainActivity跳转到OtherActivity,并从OtherActivity返回。运行界面类似:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、定义MainActivity

在主活动中定义ActivityResultLauncher来处理从其他活动返回的处理。

val resultLauncher:ActivityResultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult(),
ActivityResultCallback {
if(it.resultCode== Activity.RESULT_OK){
val returnData = it.data?.getStringExtra(“returnData”)
Toast.makeText(this,returnData,Toast.LENGTH_LONG).show()
}
})

具体代码如下:

class MainActivity : ComponentActivity() {
    private lateinit var resultLauncher: ActivityResultLauncher<Intent>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //注册活动结果,处理从其他活动返回的动作
        resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult(),
            ActivityResultCallback {
                if(it.resultCode== Activity.RESULT_OK){
                    val returnData = it.data?.getStringExtra("returnData")
                    Toast.makeText(this,returnData,Toast.LENGTH_LONG).show()
                }
            })
        setContent {
            ForCourseTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    JumpOtherScreen(resultLauncher)
                }
            }
        }
    }
}

@Composable
fun JumpOtherScreen(resultLauncher: ActivityResultLauncher<Intent>) {
    val context = LocalContext.current

    Box(modifier = Modifier.fillMaxSize().background(Color.Green),
        contentAlignment = Alignment.Center){
        Button(onClick={
            val intent = Intent(context,OtherActivity::class.java)
            intent.putExtra("data","从MainActivity跳转到OtherActivity")
            resultLauncher.launch(intent)
        }){
            Text("跳转到其他页面",fontSize = 30.sp,color = Color.White)
        }
    }
}

二、其他活动OtherActivity的处理

在其他活动中增加下列处理方式,来解决从当前活动返回上一个活动:

val intent = Intent()
intent.putExtra(“returnData”,“从OtherActivity返回”)
context.setResult(Activity.RESULT_OK,intent)
context.finish()
这里:context表示活动。

class OtherActivity : ComponentActivity() {
    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val receivedData = intent.getStringExtra("data")
        setContent {
            ForCourseTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    DisplayScreen(receivedData)
                }
            }
        }
    }
}

@Composable
fun DisplayScreen(data:String?){
    val context  = LocalContext.current as OtherActivity
    Box(contentAlignment = Alignment.Center,
        modifier = Modifier.fillMaxSize().background(Color.Blue)){
        Column{
            Text("OtherActivity界面接受的数据:${data!!}",fontSize = 30.sp,color= Color.White)
            Button(onClick={
                val intent = Intent()
                intent.putExtra("returnData","从OtherActivity返回")
                context.setResult(Activity.RESULT_OK,intent)
                context.finish()
            }){
                Text("返回到MainActivity",fontSize = 30.sp,color = Color.White)
            }
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/195545.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!