Android Navigation获取栈顶Fragment

由于项目底层是Unity,在上层切换Activity时,下面的unity界面会暂停,界面不能刷新,会有很多问题,于是我们就想到了Activity App,那么就想到了使用JetPack的Navigation来统一管理Fragment之间的跳转。

今天需求是需要判断当前栈顶的Fragment的是不是指定Fragment,如果是就不通知此条消息,那么就需要获取当前正在展示的Fragment,即栈顶的Fragment。

以往获取栈顶的Activity很简单,

    val manager: ActivityManager = getSystemService(ACTIVITY_SERVICE) as ActivityManager
    val info: ActivityManager.RunningTaskInfo = manager.getRunningTasks(1)[0]
    val className: String? = info.topActivity?.className  //类名
    val shortClassName = className?.substring(className.lastIndexOf(".") + 1, className.length)

这个还把我考住了。

最后写了个方法:

fun <F : Fragment> AppCompatActivity.getFragment(fragmentClass: Class<F>): F? {
    val navHostFragment = this.supportFragmentManager.fragments.first() as NavHostFragment
       navHostFragment.childFragmentManager.fragments.forEach {
        if (fragmentClass.isAssignableFrom(it.javaClass)) {
            return it as F
        }
    }
 
    return null
}

如何使用:因为是单Activity,所以在Activity直接调用就行了,再把Fragment的class对象传进来就行了。

isAssignableFrom()方法:确定一个类(B)是不是继承来自于另一个父类(A),一个接口(A)是不是实现了另外一个接口(B),或者两个类相同。

其实还是使用了FragmentActivity的Fragmentmanager获取到fragment列表的栈顶Fragment,在用拿到的Fragment来判断他的子Fragmeng列表,最后进行判断。

猜你喜欢

转载自blog.csdn.net/LoveFHM/article/details/125784771