我在Android开发中使用Jetpack导航组件(一个活动,多个碎片)。
我想在OnNavigatedListener中获取目标的片段实例,如下所示。
有可能吗?
class MainActivity : AppCompatActivity() {
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(this, R.layout.activity_main)
navController = Navigation.findNavController(this, R.id.nav_host_fragment)
navController.addOnNavigatedListener { controller, destination ->
// Here
}
}
}
我想在每次导航的活动中获取片段的属性(或从方法返回的值)。
例如,
val fragment = getFragmentInstanceFromDestination()
myActionBar.visible = fragment.getActionBarVisible()
答案 0 :(得分:0)
如果您使用的是1.0.0-alpha07
版本,则可以执行以下操作:
(destination as? FragmentNavigator.Destination)?.let { destinationClass ->
val isNewFullscreen = destinationClass.fragmentClass.superclass == FullScreenFragment::class.java
//... adjust paddings and hide action bar, etc.
这是我对具有两个Fragment超级类的单个Activity应用程序采取的方法,其中一个是FullScreenFragment(您可以在示例中看到一个),它隐藏了操作栏和导航栏,还隐藏了NavigationFragment(名称令人困惑,但这显示了导航栏和操作栏。
问题是,您还需要调整默认导航片段的填充,因为对于FullScreenFragments,它将占据整个屏幕,而NavigationFragment应该同时考虑操作和导航栏。
现在有了新的1.0.0-alpha08
,FragmentNavigatio.Destination.fragmentClass
不再可用,因此我仍在思考如何解决此问题。我正在考虑使用destination.id == R.id.someFullScreenFragment
,它肯定比目前没有的hacky便宜,但是我必须跟踪ID列表。
无论哪种方式,据我所知,不可能获得Fragment本身的实例,您能做的最好的就是推断目的地,并让您的单个活动相应地编排视图。