我有一个 fragment 管理器可以在我的应用程序中显示/隐藏 fragment 。现在,当我想显示任何 Activity 或 fragment 中的 fragment 时,我从管理器调用此方法
fun show(manager: FragmentManager, fragmentTag: String, container: Int, data: Any?): Companion {
var fragment = manager.findFragmentByTag(fragmentTag)
if (fragment != null) {
manager.popBackStack(fragmentTag, 0)
} else {
addFragment(manager, getFragment(fragmentTag, manager, data)!!, container, fragmentTag)
}
return this
}
private fun getFragment(fragmentTag: String, manager: FragmentManager, data: Any?): Fragment? {
when (fragmentTag) {
MenuFragment.TAG -> return getMenuFragment(manager)
TagsFragment.TAG -> return getTagsFragment(manager)
...
}
return null
}
返回具有特定类的 fragment
private fun getMenuFragment(manager: FragmentManager): Fragment {
var fragment = manager.findFragmentByTag(MenuFragment.TAG) as MenuFragment?
if (fragment == null) {
fragment = MenuFragment.newInstance()
}
return fragment
}
我希望有一个策略来避免每次需要实现一个新 fragment 时都创建一个方法,所以我正在考虑泛型或者可能是我以前从未使用过的反射。
有什么办法可以使用反射来做到这一点吗?或者其他更好的策略?
感谢您的帮助。
编辑
由于我有一个 Activity 和许多 fragment ,我最终扩展了 FragmentManager 以在每个 fragment 中使用它。
inline fun <reified T : Fragment> FragmentManager.showFragment(tag: String, container: Int, args: Bundle? = null) {
val clazz = T::class.java
var fragment = findFragmentByTag(clazz.name)
if (fragment != null) {
this.popBackStack(tag, 0)
} else {
fragment = (clazz.getConstructor().newInstance() as T).apply {
args?.let {
it.classLoader = javaClass.classLoader
arguments = args
}
}
val transaction = this.beginTransaction()
transaction.add(container, fragment as Fragment, tag)
transaction.addToBackStack(tag)
transaction.commit()
}
}
调用:
activity!!.supportFragmentManager.showFragment<MenuFragment>(MenuFragment.TAG, R.id.container)
最佳答案
如果我正确理解了一个问题,你可以像这样为 FragmentManager 编写扩展函数
inline fun <reified T : Fragment> FragmentManager.getFragment(args: Bundle? = null): Fragment {
val clazz = T::class.java
return findFragmentByTag(clazz.name) ?: return (clazz.getConstructor().newInstance() as T).apply {
args?.let {
it.classLoader = javaClass.classLoader
arguments = args
}
}
}
结束然后使用它,例如 Activity 中
val frag = supportFragmentManager.getFragment<MyFragment>()
其中 MyFragment - 是您的 fragment 类
关于android - 如何使用泛型或反射来显示/隐藏 fragment ? Kotlin 安卓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55280899/