gpt4 book ai didi

Android FragmentManager 和 Fragment Result API

转载 作者:行者123 更新时间:2023-12-04 23:56:12 26 4
gpt4 key购买 nike

使用新的 Fragment Result API 的 fragment F 如何从其他 2 个 fragment 获取结果:A、B 从 A 而不是 B 获取结果,因为 B 有不同的父 FragmentManager(我没有知道为什么) ?怎么会是那样? 2 个 fragment 以相同的方式调用,但它们最终具有相同的 Activity 但不同的 FragmentManager ?函数调用如下:

//这行不通。结果设置后不调用监听器

private fun navigateToItemLocation() {

setFragmentResultListener(REQUEST_LOCATION_KEY) { s: String, bundle: Bundle ->

val locationId = bundle.getParcelable<ParcelUuid>(LOCATION_ID)!!.uuid
viewModel.viewModelScope.launch(Dispatchers.IO) {
val location = LocationRepository().get(locationId)!!
changeItemLocation(location)
}
}


val action = ItemRegistrationPagerHolderDirections.actionNavItemRegistrationPagerToNavStockLocationSelection()
findNavController().navigate(action)
}

//这很好用:

private fun navigateToItemDetails(item: Item2) {

setFragmentResultListener(SELECTED_ITEM_KEY) { s: String, bundle: Bundle ->

val propertySetId = bundle.getParcelable<ParcelUuid>(SELECTED_ITEM_SET_ID)!!.uuid
clearFragmentResultListener(SELECTED_ITEM_KEY)

viewModel.viewModelScope.launch(Dispatchers.IO) {
val repository = PropertySetRepository()
val propertySet = repository.get(propertySetId)!!
val propertySetInfo = ItemFactory.loadPropertySetInfo(propertySet)

withContext(Dispatchers.Main) { setPackageCode(null) }
selectItem(item.item, propertySetInfo, item.description, null)
}
}

val action = ItemRegistrationPagerHolderDirections.actionNavItemRegistrationToNavStockItemDetails(ParcelUuid(item.item.id), true)
findNavController().navigate(action)
}

fragment A 和 B 都在一个单独的动态特征中。我遇到的唯一问题是调用以下函数时:

fun onSelect() {

viewModel.pickedLocation.value = (viewModel.selectedLocation as? LocationExt2?)?.location
val result = bundleOf(Pair(LOCATION_ID, ParcelUuid(viewModel.pickedLocation.value!!.id)))
setFragmentResult(REQUEST_LOCATION_KEY, result)
findNavController().popBackStack()
}

setFragmentResult(REQUEST_LOCATION_KEY, result)

不产生任何结果,因为 FragmentManager 与调用 Fragment 不同。 fragment A 中的相同方法是:

private fun onSetSelected(id: UUID) {

propertySets.removeObservers(viewLifecycleOwner)
adapter.tracker = null
setFragmentResult(SELECTED_ITEM_KEY, bundleOf(Pair(SELECTED_ITEM_SET_ID, ParcelUuid(id))))
findNavController().popBackStack()
}

作为临时解决方法,我用 Activity.supportFragmentManager.setFragmentResultListener 替换了对 Fragment 的 FragmentManager 的调用。它有效,但我仍然不明白为什么 fragment A 和 B 的行为不同......

最佳答案

检查您监听 fragment 结果的 fragment 和您设置结果的 fragment 是否在相同 fragment 管理器中。

如果您同时使用 Activity.getSupportFragmentManager()Fragment.getParentFragmentManager()Fragment.getChildFragmentManager() .

关于Android FragmentManager 和 Fragment Result API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65548478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com