簡體   English   中英

導航抽屜不適用於導航組件

[英]Navigation Drawer don't work with navigation Component

單擊菜單項時,導航抽屜不會將用戶帶到目的地。 導航抽屜顯示正確,但不起作用。 有什么問題?

我有一個導航菜單:

<?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_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/color_white">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            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_width="match_parent"
            android:layout_height="match_parent"
            app:navGraph="@navigation/main_graph" />
    </LinearLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nv"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        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 ,我認為這不好。

根據“ 添加導航抽屜”文檔 ,如果要將其連接到setupWithNavController ,則需要使用NavigationView調用setupWithNavController。 另外,您正在使用setSupportActionBar() 根據Action Bar文檔 ,您不應使用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);
}

根據操作欄文檔,在使用setSupportActionBar()時,您還需要覆蓋onSupportNavigateUp()

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

我還要注意, if (actionBar != null)檢查和其中的代碼被Navigation覆蓋-標題應通過android:label在目標位置。

這是適合我的代碼

主要活動

private DrawerLayout drawerLayout;
private NavController navController;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initToolBar();
}

private void initToolBar()
{
    MaterialToolbar toolbar = findViewById(R.id.toolbar);
    drawerLayout = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);
    navController = Navigation.findNavController(this, R.id.nav_host_fragment);

    setSupportActionBar(toolbar);
    NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout);
    NavigationUI.setupWithNavController(navigationView, navController);
}

@Override
public boolean onSupportNavigateUp() {
    return NavigationUI.navigateUp(navController, drawerLayout) || super.onSupportNavigateUp();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM