onActivityResult 多层fragment中的处理
2022-03-30 本文已影响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)
}