Android Jetpack Navigation:如何在 OnNavigatedListener 中获取目的地的片段实例?

Posted

技术标签:

【中文标题】Android Jetpack Navigation:如何在 OnNavigatedListener 中获取目的地的片段实例?【英文标题】:Android Jetpack Navigation: How to get fragment instance of destination in OnNavigatedListener? 【发布时间】:2018-11-22 12:47:39 【问题描述】:

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

【问题讨论】:

我不认为有这个选项。我不知道要实现什么场景,但也许您可以使用附加到您的活动的视图模型,以及在那里观察 LiveData 对象的片段,并从“NavigationListener”中根据目标 id 和您的片段更新此 livedata 对象将收到通知并可以“做某事”。 根据您更新的场景,您应该使用 ViewModel 和 LiveData。添加到您的视图模型 livedata 参数,例如“isToolbarVisible”,并从您的活动中观察它,从您的片段中更改它的值,并且活动将被通知。 您找到解决方案了吗? 【参考方案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.

这是我为具有两个 Fragment 超类的单个 Activity 应用程序采用的方法,其中一个是 FullScreenFragment(您可以在示例中看到正在使用的那个),它隐藏了操作栏和导航栏以及 NavigationFragment (这个名字很混乱,但是这个显示了导航栏和操作栏)。

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

现在有了新的1.0.0-alpha08FragmentNavigatio.Destination.fragmentClass 不再可用,所以我仍在思考如何解决这个问题。我正在考虑使用destination.id == R.id.someFullScreenFragment,它肯定比我现在使用的更不老套,但我必须跟踪一个 id 列表。

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

【讨论】:

有什么新方法可以像以前一样获得这个值吗?目前使用v1.0.0,同样无法获取所需的fragment。 navController.addOnDestinationChangedListener _, destination, _ -> val isNewFullscreen = isFullscreen(destination.id) //... 所以现在我只检查目的地的 ID,这就是我判断是否需要进入全屏模式的方式。在导航拱门的第一个稳定版本之后,我无法研究更多细节。零件。所以不幸的是,我没有任何更新给你,只是我将我的实现移动到我在原始答案中的第二个建议中描述的那样。

以上是关于Android Jetpack Navigation:如何在 OnNavigatedListener 中获取目的地的片段实例?的主要内容,如果未能解决你的问题,请参考以下文章

Android Jetpack架构组件带你了解Android Jetpack

Android Jetpack简介

Android Jetpack架构组件——什么是Jetpack?

Android Jetpack架构组件——什么是Jetpack?

《Android Jetpack从入门到精通+高级Jetpack强化实战》,最新Jetpack系列开发笔记开源

Android高级Jetpack架构组件+Jetpack compose强化实战