android - 如何使用泛型或反射来显示/隐藏 fragment ? Kotlin 安卓

标签 android generics reflection kotlin

我有一个 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/

相关文章:

java - 使用反射使用父类(super class)获取子类字段?

Android 从 Recyclerview 添加到购物车动画

带有 List<String> 的 Android AutoCompleteTextView

android - 带有 TextInputLayout 和 AlertDialog 的 InflateException

java - 当属性是通用属性时,使用 xstream 将 XML 反序列化为对象

c - 是否可以在 C 中创建泛型函数?

android - 我是否需要 root 权限才能访问内部类?

Android跨应用数据传递

generics - 为什么移动闭包不会捕获具有通用类型的值?

c# - 反射:调用具有泛型参数的方法