美文网首页
Android使用ActivityResultContract

Android使用ActivityResultContract

作者: SerBad | 来源:发表于2021-02-23 14:42 被阅读0次

    AndroidXActivity 1.2.0-alpha02Fragment 1.3.0-alpha02开始,startActivityForResult被标注为弃用了,因为多了一种新的办法,这里做个记录。

    新建一个自己的契约类ActivityResultContract,继承自ActivityResultContract,写上自己要传入的参数和要返回的结果。

    class PersonalActivityResultContract : ActivityResultContract<String, UserInfo?>() {
        override fun createIntent(context: Context, input: String): Intent {
            val intent = Intent(context, HeaderPreviewActivity::class.java)
            intent.putExtra("url", input)
            return intent
        }
    
        override fun parseResult(resultCode: Int, intent: Intent?): UserInfo? {
            if (resultCode == Activity.RESULT_OK) {
                if (intent?.hasExtra("userInfo") == true) {
                    if (intent.getSerializableExtra("userInfo") != null) {
                        return intent.getSerializableExtra("userInfo") as UserInfo
                    }
                }
            }
            return null
        }
    }
    

    然后在fragment或者activityonCreate中使用registerForActivityResult注册一下得到mActivityResultLauncher,需要注意的是,fragment和必须在onCreate及以前执行,activity必须在onStart及之前执行。

        private var mActivityResultLauncher: ActivityResultLauncher<String>? = null
        override fun onCreate(savedInstanceState: Bundle?) {
            mActivityResultLauncher = registerForActivityResult(PersonalActivityResultContract()) {
                if (it != null) {
                    //你自己要处理的逻辑
                }
            }
    
            super.onCreate(savedInstanceState)
        }
    

    然后在要调用的地方

    mActivityResultLauncher?.launch("")
    

    以上这样就可以了。这样写有个好处就是更好的封装,不用再自己写一大堆的onActivityResult代码,也方便解耦和复用。当然这里只是省掉了原来的startActivityForResultonActivityResult,其他的地方照旧。

    以上基本够用,当然你也可以定义自己的路由,只需要实现自己的ActivityResultRegistry就可以了。当然,你也可以在launch的地方传入你自己ActivityOptionsCompat

    如果不需要使用到startActivityForResult,还是用原来的startActivity即可。

    参考链接:https://developer.android.google.cn/training/basics/intents/result

    相关文章

      网友评论

          本文标题:Android使用ActivityResultContract

          本文链接:https://www.haomeiwen.com/subject/hnmrfltx.html