由于项目底层是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列表,最后进行判断。