Android Jetpack导航:如何在OnNavigatedListener中获取目标的片段实例?

时间:2018-06-13 03:34:24

标签: android android-jetpack android-architecture-navigation

我在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()

1 个答案:

答案 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-alpha08FragmentNavigatio.Destination.fragmentClass不再可用,因此我仍在思考如何解决此问题。我正在考虑使用destination.id == R.id.someFullScreenFragment,它肯定比目前没有的hacky便宜,但是我必须跟踪ID列表。

无论哪种方式,据我所知,不可能获得Fragment本身的实例,您能做的最好的就是推断目的地,并让您的单个活动相应地编排视图。