如何在抽屉布局(带有导航抽屉菜单)中使用Android导航组件(导航图)?

Ane*_*ess 1 java android android-fragments

我有一个导航图,它使用此片段作为主活动 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"/>
Run Code Online (Sandbox Code Playgroud)

我有一个带有菜单的抽屉布局,当我单击导航抽屉按钮时,我无法使导航正常工作(它在主片段中工作,但在我单击抽屉按钮时不起作用),如果我使用旧方法使用以下命令对导航抽屉进行编程: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...
        }
Run Code Online (Sandbox Code Playgroud)

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

ian*_*ake 5

导航组件在工件中提供了一个帮助器NavigationUInavigation-ui。根据导航抽屉的使用导航文档更新 UI 组件,您可以使用该setupWithNavController()方法通过将目标项绑定到菜单项来自动将菜单项连接到您在导航图中设置的导航目标

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

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

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