【问题标题】:onNavigationItemSelected not working in NavigationViewonNavigationItemSelected 在 NavigationView 中不起作用
【发布时间】:2016-09-10 08:46:13
【问题描述】:

请有人帮我处理导航抽屉中的片段,由于某种原因我无法让它们工作并且所有代码看起来都正确。

Here是源代码的链接。

【问题讨论】:

  • 请解释您遇到的问题。说“不工作”太宽泛了。
  • 有什么问题?
  • 如果你下载并打开安卓项目,你会注意到它有一个导航抽屉,我想正确使用它,例如,我想点击 The Wetlands 反过来应该将当前片段更改为 fragment_the_wetlands 我现在刚刚有一个虚拟时钟来查看片段是否正在更改。我似乎无法做到这一点,请帮忙。

标签: android android-fragments android-navigationview


【解决方案1】:

使用此代码:

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

【讨论】:

  • 这对我有帮助...非常感谢!!
  • 哇,我只是不明白为什么这有效......但它有效。
  • 使用数据绑定.bringToFront() 解决了这个问题。所以:_binding.navView.setNavigationItemSelectedListener(this) - 还不够。然后添加_binding.navView.bringToFront() - 监听器被触发。
  • 谢谢,4 天没有解决方案,答案就在这里:navigationView.bringToFront();非常感谢!
【解决方案2】:

看看你的MainActivity.java

您已经在MainActivity 中实现了NavigationView.OnNavigationItemSelectedListener 的回调,如下所示,

@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

所以你没有使用你在MainActivity中覆盖的OnNavigationItemSelectedListener

解决方案是使用this 作为setNavigationItemSelectedListener 的参数。通过这样做,您的所有点击都将转到MainActivityonNavigationItemSelected,而不是转到本地的onNavigationItemSelected

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

同样将本地onNavigationItemSelected中的代码移动到MainActivityonNavigationItemSelected中。

所以你的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>

祝你好运。

【讨论】:

    【解决方案3】:

    不要使用

    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;
                }
            });
    

    【讨论】:

    • 这个答案真的是救命稻草
    • 对于那些关注this official tutorial的人,这就是你想要的解决方案。
    【解决方案4】:

    前段时间我也遇到过同样的问题,最后我意识到我没有写下面代码的第二行

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

    你确保你写的一样,否则你的听众将无法工作

    【讨论】:

      【解决方案5】:

      在我的情况下,我忘记初始化导航菜单。

      请遵循以下代码:

      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);
      }
      

      愉快的编码...

      【讨论】:

        【解决方案6】:

        确保您已实现接口 NavigationView.OnNavigationItemSelectedListener。 第二点确保添加这些行,否则不会调用listnere。

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

        【讨论】:

          【解决方案7】:

          添加此行
          导航视图.bringToFront(); 它对我有用

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-08-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多