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

nao*_*ada 11 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:场景

我想在每次导航的活动中获取片段的属性(或从方法返回的值).

例如,

val fragment = getFragmentInstanceFromDestination()
myActionBar.visible = fragment.getActionBarVisible()
Run Code Online (Sandbox Code Playgroud)

jpa*_*ezl 1

如果您使用的是该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.
Run Code Online (Sandbox Code Playgroud)

这是我对具有两个 Fragment 超类的单个 Activity 应用程序采取的方法,其中之一是 FullScreenFragment(您可以在示例中看到使用的那个),它隐藏操作栏和导航栏,还有 NavigationFragment(名称是令人困惑,但这一个显示了导航栏和操作栏)。

这样做的问题是,您还需要调整默认导航片段的填充,对于 FullScreenFragment 来说,它将占据整个屏幕,而 NavigationFragment 应该同时考虑操作栏和导航栏。

现在新的1.0.0-alpha08已经FragmentNavigatio.Destination.fragmentClass不可用了,所以我还在想如何解决这个问题。我正在考虑使用destination.id == R.id.someFullScreenFragment,它肯定比我目前所使用的更简单,但我必须跟踪 ids 列表。

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