【问题标题】:How to use the Android Navigation component (Nav Graph) in a Drawer Layout (with navigation drawer Menu)?如何在抽屉布局(带导航抽屉菜单)中使用 Android 导航组件(Nav Graph)?
【发布时间】:2020-05-16 17:45:33
【问题描述】:

我有一个导航图,它使用这个片段作为主要活动 XML 中的主页。

        <fragment
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        class="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/main_nav_graph"
        app:defaultNavHost="true"/>

我有一个带有菜单的抽屉布局,当我点击抽屉导航按钮时,我无法使导航工作(它在主片段中工作,但在我点击抽屉按钮时不起作用),如果我使用使用getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new_fragment).commit(); 对导航抽屉进行编程的旧方法,我的导航控制器丢失了!我得到像

这样的错误

navcontroller 未知的目标片段,因为控制器将看到当前显示的主片段,即使不是这种情况(来自调试)

public boolean onNavigationItemSelected(MenuItem item) {

        switch (item.getItemId()){
            case R.id.action_1:
                //doesn't work when it current fragment doesnt match the 
                //action_fromfragmentx_to_fragmenty
                Navigation.findNavController(this,R.id.fragment_container)
                .navigate(R.id.action_fromfragmentx_to_fragmenty);
                break;

            //Other menu options...
        }

因此我的问题是:我应该如何在 Java 中覆盖这个 onNavigationItemSelected 以使导航组件工作?关于这个主题的任何链接或相关文档(Java)?。

【问题讨论】:

  • 你读过这个吗? medium.com/@stavro96/…
  • 嗨,是的,我正在阅读它,但我无法真正获得 onOptionsItemSelected 的 Kotlin 代码,因为我对 kotlin 不太擅长。这就是我在这个问题上写(In Java)的原因
  • @John Joe 抱歉,我无法将项目上传到 github。但我很欣赏您基于 Kotlin 的文章推荐。如果你在 Java 中有一些指针会很好。
  • 如果您使用NavigationUI.setupWithNavController(),则根本不必覆盖onNavigationItemSelected - 通过启动与您的菜单项具有相同ID的目标,您可以完成所有工作。你到底想做什么?
  • @ianhanniballake 非常感谢您的回复(setupWithNavController() 不知道此功能)。好吧,我通常在我的应用程序中使用抽屉菜单,这是我第一次尝试使用 Nav Graph 实用程序。这是一个小型 android 项目(库存和库存),所以我发现 NavGraph 到目前为止非常棒。但是我真的很想将导航抽屉保留在我的应用程序中。无论如何,谢谢,我将尝试阅读有关此 setupWithNavController() 的更多信息

标签: java android android-fragments


【解决方案1】:

导航组件在NavigationUI 中的navigation-ui 工件中提供了一个帮助器类。根据Update UI components with Navigation documentation for navigation drawers,您可以使用setupWithNavController() 方法自动将菜单项连接到您在导航图中通过tying the destination item to a menu item 设置的导航目标:

如果MenuItem 的 id 与目的地的 id 匹配,则NavController 可以导航到该目的地。

因此,您根本不需要 onNavigationItemSelected 实现,也不需要执行任何 FragmentTransactions。只需确保菜单 XML 中的 android:id="@+id/fragment_y" 与导航 XML 中的 android:id="@+id/fragment_y" 匹配,然后调用 setupWithNavController()

NavigationView navView = findViewById(R.id.nav_view);
// This is what sets up its own onNavigationItemSelected
NavigationUI.setupWithNavController(navView, navController);

【讨论】:

  • 非常感谢您的回复不知道我们有这样的自动功能,终于让它工作了:)
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
相关资源
最近更新 更多