Android NavigationView onNavigationItemSelected不工作

Android NavigationView onNavigationItemSelected不工作,android,android-studio,navigation-drawer,android-navigationview,Android,Android Studio,Navigation Drawer,Android Navigationview,我一直试图让我的导航抽屉事件工作,但你猜到了,它不会。因为每次我单击导航抽屉中的某个项目时,都不会触发任何事件。我在这里也尝试了一些帮助,但是没有效果 活动\u main.xml MainActivity.java package com.example.airtimflip; 导入android.os.Bundle; 导入com.google.android.material.floatingactionbutton.floatingactionbutton; 导入com.google.a

我一直试图让我的导航抽屉事件工作,但你猜到了,它不会。因为每次我单击导航抽屉中的某个项目时,都不会触发任何事件。我在这里也尝试了一些帮助,但是没有效果

活动\u main.xml


MainActivity.java

package com.example.airtimflip;
导入android.os.Bundle;
导入com.google.android.material.floatingactionbutton.floatingactionbutton;
导入com.google.android.material.snackbar.snackbar;
导入android.view.MenuItem;
导入android.view.view;
导入androidx.annotation.NonNull;
导入androidx.core.view.GravityCompat;
导入androidx.navigation.NavController;
导入androidx.navigation.navigation;
导入androidx.navigation.ui.AppBarConfiguration;
导入androidx.navigation.ui.NavigationUI;
导入com.google.android.material.navigation.NavigationView;
导入androidx.drawerlayout.widget.drawerlayout;
导入androidx.appcompat.app.appcompat活动;
导入androidx.appcompat.widget.Toolbar;
导入androidx.recyclerview.widget.recyclerview;
导入android.view.Menu;
导入android.widget.Toast;
导入java.util.ArrayList;
导入java.util.List;
公共类MainActivity扩展AppCompatActivity实现NavigationView.OnNavigationItemSelectedListener{
私有AppBarConfiguration mAppBarConfiguration;
私有导航视图导航视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=findviewbyd(R.id.Toolbar);
设置支持操作栏(工具栏);
/*FloatingActionButton fab=findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Snackbar.make(查看“替换为您自己的操作”,Snackbar.LENGTH\u LONG)
.setAction(“Action”,null).show();
}
});*/
抽屉布局抽屉=findViewById(R.id.抽屉布局);
NavigationView NavigationView=findViewById(R.id.nav_视图);
//将事件侦听器添加到导航视图
navigationView.setNavigationItemSelectedListener(此);
//将每个菜单ID作为一组ID传递,因为每个
//菜单应被视为顶级目的地。
mAppBarConfiguration=新建AppBarConfiguration.Builder(
R.id.nav_主页,R.id.nav_配置文件,R.id.nav_经理,
R.id.nav\u空中交通管制,R.id.nav\u购买广播时间,R.id.nav\u发送钱)
.setDrawerLayout(抽屉)
.build();
NavController NavController=Navigation.findNavController(这个,R.id.nav_主机_片段);
NavigationUI.setupActionBarWithNavController(此、navController、mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView,navController);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
@凌驾
公共布尔onSupportNavigateUp(){
NavController NavController=Navigation.findNavController(这个,R.id.nav_主机_片段);
返回NavigationUI.navigateUp(导航控制器,mAppBarConfiguration)
||super.onSupportNavigateUp();
}
@凌驾
公共布尔值onNavigationItemSelected(@NonNull MenuItem MenuItem){
int id=menuItem.getItemId();
if(id==R.id.nav_home){
Toast.makeText(这个“Home”,Toast.LENGTH_SHORT).show();
}否则如果(id==R.id.nav\U atc){
Toast.makeText(这是“从广播时间到现金”,Toast.LENGTH_SHORT).show();
}否则如果(id==R.id.nav\u buy\u airtime){
Toast.makeText(这是“购买播放时间”,Toast.LENGTH_SHORT).show();
}else if(id==R.id.nav_profile){
Toast.makeText(这是“profile”,Toast.LENGTH_SHORT).show();
}else if(id==R.id.nav_管理器){
Toast.makeText(这是“Accoun管理器”,Toast.LENGTH_SHORT).show();
}else if(id==R.id.nav\u send\u money){
Toast.makeText(这个“寄钱”,Toast.LENGTH_SHORT).show();
}
抽屉布局抽屉布局=(抽屉布局)findViewById(R.id.drawer\U布局);
抽屉布局。关闭抽屉(重力公司启动);
返回true;
}
}

我没有任何错误,也不知道哪里弄错了。

您不能同时使用
NavigationUI.setupWithNavController()
setNavigationItemSelectedListener()

onNavigationItemSelected
如果您从代码中删除这一行,它将起作用:

    NavigationUI.setupWithNavController(navigationView, navController);

但是您必须手动处理片段事务。

这段代码对我来说很有用

隐藏这条线

NavigationUI.setupWithNavController(navigationView,navController)

并把代码注释在下面

your.package.name

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;

import com.facebook.AccessToken;
import com.facebook.login.LoginManager;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.navigation.NavigationView;

import androidx.annotation.NonNull;
import androidx.core.view.GravityCompat;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

public class MainActivity extends AppCompatActivity {

    private AppBarConfiguration mAppBarConfiguration;

    public TextView txt_name;

    BottomNavigationView Bottom_Nav;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = findViewById(R.id.drawer_layout);

        NavigationView navigationView = findViewById(R.id.nav_view);

        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_message, R.id.nav_notification, R.id.nav_account, R.id.nav_number, R.id.nav_website, R.id.nav_setting, R.id.nav_logout)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        //NavigationUI.setupWithNavController(navigationView, navController);
/*
* Put this code 
* */
        DrawerLayout drawerLayout = findViewById(R.id.drawer_layout);
        NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout);
        NavigationUI.setupWithNavController(navigationView, navController);
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                Toast.makeText(NavigationDrawerActivity.this, "Hello", Toast.LENGTH_SHORT).show();
                int id = menuItem.getItemId();
                if (id == R.id.nav_account) {
                    Log.d(Config.LOGTAG ,"In Account");
                }
                if (id == R.id.nav_logout) {
                    Log.d(Config.LOGTAG ,"In Log out");
                }
                DrawerLayout drawer = findViewById(R.id.drawer_layout);
                drawer.closeDrawer(GravityCompat.START);
                return false;
            }
        });
/*
* Put this code 
* */

}

除了您在此处指定的方法之外,没有其他方法可以处理此问题,但这可能会增加复杂性,您可以将
addOnDestinationChangedListener
添加到导航控制器,检测目的地并显示相应的toast等。我使用了addOnDestinationChangedListener,它似乎只检测您当前所在的目的地,而实际上不是我想要的目的地。我已经删除了NavigationUI.setupWithNavController(navigationView,navController);它正在工作,但我只希望所选项目被标记为活动,而不是所有项目,因为我选择的每个项目都会变绿,并且不会消失在导航UI中。在NavDestinationSelected(menuItemId,navController)上也可以工作,以便更清晰地显示您可以参考此答案