美文网首页
onActivityResult 多层fragment中的处理

onActivityResult 多层fragment中的处理

作者: 阡陌昏晨 | 来源:发表于2022-03-30 14:26 被阅读0次

大家是不是经常遇到Activity A中使用viewpager viewpager中嵌套几个fragment,甚至 viewpager中的fragment 又嵌套了fragment,fragment中需要选择头像,如何让头像的数据返回到对应的fragment中的onActivityResult呢?

第一种方法,那么我们就需要在Activity A中的OnActivityResult进行处理

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        for (index in 0 until supportFragmentManager.fragments.size) {
            val fragment: Fragment = supportFragmentManager.fragments[index] //找到第一层Fragment
            if (data != null && fragment != null) {
                handleResult(fragment, requestCode, resultCode, data)
            }
        }
    }

    /**
     * 递归调用,对所有的子Fragment生效
     * @param fragment
     * @param requestCode
     * @param resultCode
     * @param data
     */
    private fun handleResult(fragment: Fragment, requestCode: Int, resultCode: Int, data: Intent) {
        fragment.onActivityResult(requestCode, resultCode, data) //调用每个Fragment的onActivityResult
        val childFragment = fragment.childFragmentManager.fragments //找到第二层Fragment
        if (childFragment != null)
            for (f in childFragment) f?.let {
                handleResult(it,
                    requestCode,
                    resultCode,
                    data)
            }
    }

然后在fragment中onActivityResult 就能搞定了

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == Activity.RESULT_OK) {
            when (requestCode) {
                PictureConfig.CHOOSE_REQUEST -> handleAvatar(data!!)
            }
        }
    }

第二种方式 如果你的appcompat版本低于1.3.0 那么可以升级到1.3.0

implementation 'androidx.appcompat:appcompat:1.3.1'
 private val startActivity =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult? ->
            if(result?.resultCode == Activity.RESULT_OK){
                val selectList = PictureSelector.obtainMultipleResult(result?.data)
            }
        }

     mIvTouxiang.setOnClickListener {
            val intent = Intent(activity, PictureSelectorActivity::class.java)
            startActivity.launch(intent)
        }

相关文章

网友评论

      本文标题:onActivityResult 多层fragment中的处理

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