使用Android的导航组件时,在后台列出片段

时间:2019-05-26 19:59:43

标签: android android-fragments kotlin navigation android-components

我正在尝试调试一些代码,并希望列出Android当前堆中的片段。备用解决方案是简单地从支持经理中列出它们,因此从活动中的方法中列出:

    output:
        expand("per_label/myfile.{label}.{{chromosome}}.txt", label=LABELS)

不过,将其与Android的导航组件一起使用只会列出导航主机片段。

Log.i("fragments","Count : " + supportFragmentManager.fragments.toString())

关于SO的一些答案,例如Sergii Suvorov提供以下选择:

... I/fragments: [NavHostFragment{b1a2d20 (f8ec2420-b534-42df-89f0-0cb189610a26) id=0x7f080001}]

哪个简单地为我返回null

Log.i("fragments","Count : " + supportFragmentManager.findFragmentById(R.id.NAVIGATION)?.childFragmentManager?.fragments.toString())

片段方法中,我可以称呼以下

... I/fragments: null

它确实会返回期望的结果

Log.i("fragments", fragmentManager?.fragments.toString())

但是我没有从活动中看到如何做到这一点,也许那里有人知道魔咒?

1 个答案:

答案 0 :(得分:0)

要从Activity执行此操作,可以使用getBackStackEntryAt方法。然后,根据反向堆栈条目的名称,您可以尝试搜索对应的  Fragment。例如:

for (i in 0..supportFragmentManager.backStackEntryCount) {
    val name = supportFragmentManager.getBackStackEntryAt(i).name
    val fragment = supportFragmentManager.findFragmentByTag(name)
    if (fragment != null) {
        Log.i("TEST", "Fragment " + name + " : " + fragment)
        for (j in 0..fragment.childFragmentManager.backStackEntryCount) {
            val childName = fragment.childFragmentManager.getBackStackEntryAt(j).name
            val childFragment = fragment.childFragmentManager.findFragmentByTag(childName)
            if (childFragment != null) {
                Log.i("TEST", "Child fragment of " + name + " : " + childFragment)
            }    
        }
    } 
}

从这里,您可以看到所有片段,包括其子片段(如果有)。