onNavigationItemSelected не работает в NavigationView

Пожалуйста, помогите мне с фрагментами из навигационного ящика, по какой-то причине я не могу заставить их работать, и весь код выглядит правильно.

Здесь ссылка на исходный код.


person Matt Hutchings    schedule 10.09.2016    source источник
comment
Пожалуйста, объясните проблему, с которой вы столкнулись. Сказать, что не работает, слишком широко.   -  person Umair Farooq    schedule 10.09.2016
comment
В чем проблема?   -  person K Neeraj Lal    schedule 10.09.2016
comment
Если вы загрузите и откроете проект Android, вы заметите, что в нем есть панель навигации, которую я хотел бы использовать должным образом, например, я хотел бы щелкнуть The Wetlands, который, в свою очередь, должен изменить текущий фрагмент на fragment_the_wetlands У меня пока есть фиктивные часы, чтобы увидеть, меняется ли фрагмент. Я не могу понять это правильно, пожалуйста, помогите с этим.   -  person Matt Hutchings    schedule 10.09.2016


Ответы (7)


Взгляните на свой MainActivity.java.

Вы реализовали обратные вызовы для NavigationView.OnNavigationItemSelectedListener в MainActivity, как показано ниже,

@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
    // blah blah
}

Также проверьте метод setupDrawerContent.

private void setupDrawerContent(NavigationView navigationView) {
    navigationView.setNavigationItemSelectedListener(
            new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(MenuItem menuItem) {
                    menuItem.setChecked(true);
                    drawerLayout.closeDrawers();
                    return true;
                }
            });
}

В этом методе вы создаете локальный файл OnNavigationItemSelectedListener.

Таким образом, вы не используете OnNavigationItemSelectedListener, который вы переопределили в MainActivity.

Решение состоит в том, чтобы использовать this в качестве аргумента для setNavigationItemSelectedListener. Таким образом, все ваши клики будут идти на onNavigationItemSelected из MainActivity, а не на локальный onNavigationItemSelected.

private void setupDrawerContent(NavigationView navigationView) {
    navigationView.setNavigationItemSelectedListener(this);
}

Также переместите код из локального onNavigationItemSelected в onNavigationItemSelected из MainActivity.

Итак, ваш onNavigationItemSelected будет примерно таким,

@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
    // Handle navigation view item clicks here.
    int id = menuItem.getItemId();
    menuItem.setChecked(true);
    drawerLayout.closeDrawers();

    if (id == R.id.nav_home) {
        // Handle the home action
        Toast.makeText(this, "Home", Toast.LENGTH_SHORT).show();
    } else if (id == R.id.nav_the_wetlands) {
        Toast.makeText(this, "The Wetlands", Toast.LENGTH_SHORT).show();
        TheWetlandsFragment theWetlandsFragment = new TheWetlandsFragment();
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.relativelayout_for_fragment, theWetlandsFragment, theWetlandsFragment.getTag()).commit();
    } else if (id == R.id.nav_the_mistbelt_forests) {
        Toast.makeText(this, "The Mistbelt Forests", Toast.LENGTH_SHORT).show();
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

Также измените свой activity_main_drawer_view.xml следующим образом, чтобы решить проблему множественного выбора, которая у вас есть в ящике навигации,

<?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/nav_home"
            android:icon="@drawable/ic_dashboard"
            android:title="Home" />
    </group>

    <item android:title="Information">
        <group android:checkableBehavior="single">
            <item
                android:id="@+id/nav_the_wetlands"
                android:icon="@drawable/ic_event"
                android:title="The Wetlands" />
            <item
                android:id="@+id/nav_the_mistbelt_forests"
                android:icon="@drawable/ic_event"
                android:title="The Mistbelt Forests" />
            <item
                android:id="@+id/nav_the_grasslands"
                android:icon="@drawable/ic_event"
                android:title="The Grasslands" />
        </group>
    </item>

    <item android:title="Quick Go To">
        <group android:checkableBehavior="single">
            <item
                android:id="@+id/nav_accommodation"
                android:icon="@drawable/ic_event"
                android:title="Accommodation" />
            <item
                android:id="@+id/nav_cuisine"
                android:icon="@drawable/ic_forum"
                android:title="Cuisine" />
            <item
                android:id="@+id/nav_leisure_activites"
                android:icon="@drawable/ic_forum"
                android:title="Leisure &amp; Activites" />
            <item
                android:id="@+id/nav_agri_tourism"
                android:icon="@drawable/ic_forum"
                android:title="Agri-tourism" />
            <item
                android:id="@+id/nav_education"
                android:icon="@drawable/ic_forum"
                android:title="Education" />
            <item
                android:id="@+id/nav_arts_crafts_decor"
                android:icon="@drawable/ic_forum"
                android:title="Arts, Crafts &amp; DeCor" />
            <item
                android:id="@+id/nav_selective_shopping"
                android:icon="@drawable/ic_forum"
                android:title="Selective Shopping" />
            <item
                android:id="@+id/nav_for_children"
                android:icon="@drawable/ic_forum"
                android:title="For Children" />
        </group>
    </item>

    <item android:title="Midlands Animals">
        <group android:checkableBehavior="single">
            <item
                android:id="@+id/nav_midlands_birding_checklist"
                android:icon="@drawable/ic_dashboard"
                android:title="Midlands Birding Checklist" />
            <item
                android:id="@+id/nav_midlands_mammals_checklist"
                android:icon="@drawable/ic_dashboard"
                android:title="Midlands Mammals Checklist" />
        </group>
    </item>

</menu>

Удачи.

person K Neeraj Lal    schedule 12.09.2016

Используйте этот код:

navigationView = (NavigationView) findViewById(R.id.navigationView); 
navigationView.bringToFront();
person Vahid Rezazadeh    schedule 12.09.2017
comment
Это помогло мне... большое спасибо!! - person this is yash; 21.11.2018
comment
Вау, я просто не понимаю, почему это сработало... но это сработало. - person Xijukx; 14.09.2019
comment
С привязкой данных .bringToFront() решил проблему. Итак: _binding.navView.setNavigationItemSelectedListener(this) - мало. Затем добавьте _binding.navView.bringToFront() — и слушатель сработает. - person akamuza; 20.11.2019
comment
Может кто-нибудь объяснить, почему это работает? - person Ali Akber; 15.06.2021

Я также столкнулся с той же проблемой некоторое время назад, и в конце концов я понял, что не написал 2-ю строку следующего кода.

navigationView = (NavigationView) findViewById(R.id.navigation_view);        
navigationView.setNavigationItemSelectedListener(this);

вы убедитесь, что вы написали то же самое, иначе ваш слушатель не будет работать

person Ankit Pandey    schedule 07.02.2017

Не используйте

NavigationUI.setupWithNavController(navigationView, navController);

вместо этого сделай это

navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                Toast.makeText(MainActivity.this, "clicked", Toast.LENGTH_SHORT).show();
                return false;
            }
        });
person sandeep mali    schedule 12.07.2020
comment
Этот ответ действительно спасает жизнь - person Emmanuel Njorodongo; 18.03.2021
comment
Для тех, кто следует этому официальному руководству, это решение, которое вам нужно. - person starbeamrainbowlabs; 19.04.2021

Убедитесь, что вы реализовали интерфейс NavigationView.OnNavigationItemSelectedListener. Во-вторых, обязательно добавьте эти строки, иначе listnere не будет вызываться.

navigationView=(NavigationView) findviewbyid(R.id.navigation_view);
navigationView.setNavigationItemSelectedListener(this);
person Ali Raees    schedule 18.11.2019

в моем случае я забыл инициализировать меню навигации.

Пожалуйста, следуйте следующему коду:

public void initSideMenu() {

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

удачного кодирования...

person Ghanshyam Doifode    schedule 15.09.2019

Добавить эту строку
navigationView.bringToFront(); Это работает для меня

person Junaid Nawab    schedule 07.06.2021