作者:訫嬘風飛_487_519 | 来源:互联网 | 2022-12-10 13:38
在尝试导航组件之前,我曾经手动执行片段事务并使用片段标记来获取当前片段.
val fragment:MyFragment = supportFragmentManager.findFragmentByTag(tag):MyFragment
现在在我的主要活动布局中,我有类似的东西:
如何通过导航组件检索当前显示的片段?干
supportFragmentManager.findFragmentById(R.id.nav_host)
返回一个NavHostFragment
,我想检索我显示的'MyFragment`.
谢谢.
1> Andrei Toade..:
我设法找到了一种方法,现在如下:
NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host);
navHostFragment.getChildFragmentManager().getFragments().get(0);
如果你知道它是第一个片段.我还在调查没有这个的方法.我同意这不是最好的方法,但这应该是现在的事情.
很高兴看到一个有效的解决方案.我放弃了这一点并开始在活动和片段之间使用共享的viewModel,这意味着我可以在它们之间传递事件而无需回调或直接访问.
2> slhddn..:
我无法找到检索当前片段实例的方法.但是,您可以使用下面的代码获取最后添加的片段的ID.
navController.getCurrentDestination().getId()
它返回导航文件中的ID.希望这可以帮助.
3> Nicolas Piet..:
您应该查看导航片段的childFragmentManager primaryNavigationFragment属性,这是引用当前显示的片段的位置。
val navHost = supportFragmentManager.findFragmentById(R.id.main_nav_fragment)
navHost?.let { navFragment ->
navFragment.childFragmentManager.primaryNavigationFragment?.let {fragment->
//DO YOUR STUFF
}
}
}
4> 小智..:
用于addOnDestinationChangedListener
具有NavHostFragment
NavController navCOntroller= Navigation.findNavController(MainActivity.this,R.id.your_nav_host);
navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
@Override
public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
Log.e(TAG, "onDestinationChanged: "+destination.getLabel());
}
});