首页 > 解决方案 > Android Jetpack Navigation:如何在 OnNavigatedListener 中获取目的地的片段实例?

问题描述

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

标签: androidandroid-jetpackandroid-architecture-navigation

解决方案


如果您使用的是该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,它肯定比我目前使用的要少,但我必须跟踪一个 id 列表。

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


推荐阅读