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


    在本人博客中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)
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    二、其他活动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)
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    前端开发面试题—JavaScript循环语句
    Pyramid Scene Parsing Network–CVPR,2017论文解读及其pytorch代码
    英语复习-10.22
    深信服技术认证“SCSA-S”划重点:渗透测试工具使用
    【Express.js】软件构建
    2021年程序员自述:“别人是财源滚滚,我却是裁员滚滚”
    助力燃气安全运行:智慧燃气管网背景延展
    Java与GitLab OpenAPI交互
    【Java8新特性】函数式接口
    【最全日期获取合集】js获取昨天,今天,明天,上周,本周,下周,上月,本月,下月,去年,本年,明年,上季度,本季度,下季度,向前推日期等【全覆盖,拿来即用】
  • 原文地址:https://blog.csdn.net/userhu2012/article/details/133750446