导航抽屉不适用于导航组件

Posted

技术标签:

【中文标题】导航抽屉不适用于导航组件【英文标题】:Navigation Drawer don't work with navigation Component 【发布时间】:2019-08-22 04:21:03 【问题描述】:

当用户点击菜单项时,导航抽屉不会让用户到达目的地。导航抽屉显示正确,但不起作用。有什么问题?

我有一个导航菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        ...        
        <item
            android:id="@+id/feedbackFragment"
            android:icon="@drawable/ic_help"
            android:title="@string/title_help" />
    </group>

</menu>

还有导航图:

  <fragment
      android:id="@+id/feedbackFragment"
      android:name="com.company.ru.ui.FeedBackFragment"
      android:label="fragmegment_feedback"
      tools:layout="@layout/fragment_feed_back" />

在我的 MainActivity 中,我有一个工具栏(全部复制):

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_
    android:layout_
    android:background="@color/color_white">

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_
            android:layout_
            android:background="?attr/colorPrimary"
            android:theme="@style/ThemeOverlay.AppCompat.ActionBar" />

        <fragment
            android:id="@+id/nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_
            android:layout_
            app:navGraph="@navigation/main_graph" />
    </LinearLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nv"
        android:layout_
        android:layout_
        android:layout_gravity="start"
        android:background="@color/color_white"
        android:theme="@style/NavigationView"
        app:headerLayout="@layout/nav_header"
        app:itemIconPadding="@dimen/margin_16"
        app:itemIconTint="#FFD000"
        app:itemTextColor="@android:color/black"
        app:menu="@menu/navigation_menu" />
</androidx.drawerlayout.widget.DrawerLayout>

我以这种方式初始化我的抽屉:

@Override
protected void onCreate(Bundle savedInstanceState) 
    setTheme(R.style.AppTheme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    controller = Navigation.findNavController(this, R.id.nav_host_fragment);

    initToolbar(getString(R.string.splash_screen_text));
    

private void initToolbar(String title) 
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ActionBar actionbar = getSupportActionBar();
    if (actionbar != null) 
        actionbar.setDisplayHomeAsUpEnabled(true);
        actionbar.setHomeAsUpIndicator(R.drawable.ic_dehaze);
        actionbar.setTitle(title);
    
    toolbar.setTitleTextAppearance(this, R.style.RobotoBoldTextAppearance);
    initDrawer();
    

private void initDrawer() 
    drawerLayout = findViewById(R.id.drawer_layout);

    Toolbar toolbar = findViewById(R.id.toolbar);
    NavigationUI.setupWithNavController(toolbar, controller, drawerLayout);
    

我是按向导做的,但这很奇怪,在我看来一切都应该没问题。

我不喜欢我不使用NavigationView,我认为这不行。

【问题讨论】:

【参考方案1】:

根据Add a Navigation Drawer documentation,如果要将其连接到导航控制器,则需要使用NavigationView 调用setupWithNavController。此外,您正在使用setSupportActionBar()。根据Action Bar documentation,您不应该使用NavigationUI.setupWithNavController(toolbar, controller, drawerLayout),而是使用setupActionBarWithNavController() 方法

private void initDrawer() 
    drawerLayout = findViewById(R.id.drawer_layout);

    // Set up the Action Bar with NavController
    NavigationUI.setupActionBarWithNavController(this, controller, drawerLayout);

    // Now hook up your NavigationView
    NavigationView navigationView = findViewById(R.id.nv);
    NavigationUI.setupWithNavController(navigationView, controller);

您还需要根据Action Bar documentation 使用setSupportActionBar() 时覆盖onSupportNavigateUp()

@Override
public boolean onSupportNavigateUp() 
    return navController.navigateUp(drawerLayout) || super.onSupportNavigateUp();

我还应注意if (actionBar != null) 检查和其中的代码被导航覆盖 - 标题应通过目的地上的android:label 设置。

【讨论】:

以上是关于导航抽屉不适用于导航组件的主要内容,如果未能解决你的问题,请参考以下文章

从左到右反应本机抽屉导航拖动抽屉不起作用

如何打开关闭应用程序后打开的最后一个片段并使用导航抽屉和导航组件重新打开它

从左到右反应原生抽屉导航拖动抽屉不起作用

导航架构组件 - 导航抽屉

如何同时使用导航抽屉和底部导航 - 导航架构组件

Android导航组件“向上按钮”打开抽屉导航