以下是一个使用Android FragmentManager和Fragment Result API的代码示例:
首先,在您的布局文件中添加一个FragmentContainerView,用于容纳Fragment。例如,您可以在activity_main.xml中添加以下代码:
接下来,在您的Activity中,您可以使用FragmentManager将Fragment添加到FragmentContainerView中。例如,您可以在MainActivity.kt中添加以下代码:
class MainActivity : AppCompatActivity() {
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment
navController = navHostFragment.navController
// 设置Fragment Result监听器
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// 检查当前Fragment是否处理了返回事件
if (!navController.handleOnBackPressed()) {
// 如果没有处理,执行默认的返回操作
super.handleOnBackPressed()
}
}
}
// 添加Fragment Result监听器
navController.addOnDestinationChangedListener { _, destination, _ ->
callback.isEnabled = destination.id == R.id.fragment_with_result
}
// 添加返回监听器
onBackPressedDispatcher.addCallback(this, callback)
}
// 发送Fragment Result
fun sendFragmentResult(result: String) {
val currentFragment = navController.currentDestination?.id
if (currentFragment == R.id.fragment_with_result) {
val bundle = bundleOf("result" to result)
navController.previousBackStackEntry?.savedStateHandle?.set("result_key", bundle)
}
}
}
在上面的代码中,我们使用FragmentManager和NavHostFragment来设置FragmentContainerView。我们还通过addOnDestinationChangedListener检查当前目标Fragment是否支持Fragment Result,并通过setOnBackPressedCallback添加了一个返回事件监听器来处理返回操作。
然后,在要接收Fragment Result的Fragment中,您可以使用SavedStateHandle来获取Fragment Result。例如,您可以在FragmentWithResult.kt中添加以下代码:
class FragmentWithResult : Fragment() {
private lateinit var binding: FragmentWithResultBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = FragmentWithResultBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 获取Fragment Result
val result = requireArguments().getString("result")
binding.resultTextView.text = result
}
}
在上面的代码中,我们使用SavedStateHandle来获取Fragment Result,并在TextView中显示它。
最后,在要发送Fragment Result的Fragment或Activity中,您可以使用MainActivity中的sendFragmentResult方法来发送Fragment Result。例如,在FragmentWithResult.kt中,您可以添加以下代码:
class FragmentWithResult : Fragment() {
// ...
private fun sendResult() {
val result = "This is the result"
(requireActivity() as? MainActivity)?.sendFragmentResult(result)
}
}
上面的代码中,我们调用MainActivity中的sendFragmentResult方法,并传递一个结果字符串。
这就是使用Android FragmentManager和Fragment Result API的解决方法的一个示例。您可以根据自己的需求进行修改和扩展。