onNavigationItemSelected未被调用

时间:2016-04-13 16:50:49

标签: android android-navigation-drawer android-navigationview

我在我的应用中实现了导航视图,该视图由AndroidStudio自动创建。当我创建一个新项目并且菜单项看起来没问题时,我选择了NavigationDrawer Activity,但是当我点击任何一个菜单项时没有任何事情发生。 以下是我的onNavigationItemSelected()方法:

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    Toast.makeText(MainActivity.this,"onNavigationItemSelected",Toast.LENGTH_LONG).show();
    // Handle navigation view item clicks here.
    item.setChecked(true);
    int id = item.getItemId();

    if (id == R.id.medicalRecord) {
        Toast.makeText(MainActivity.this,id,Toast.LENGTH_LONG).show();
    } 

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

}

我的onCreate方法,我在其中创建了NavigationView

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linear_layout);
    if (babyImage.exists()) {
        Drawable drawable = Drawable.createFromPath(Environment.getExternalStorageDirectory() + "/babycare/temp.jpg");
        linearLayout.setBackground(drawable);
    }

    DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerLayout.openDrawer(Gravity.LEFT);
    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

当然,我为我的类实现了NavigationView.OnNavigationItemSelectedListener。

我想知道这个NavigationView是否应该在Material Design主题中实现。现在我的应用中使用的主题是@style/AppTheme

请有人帮助我,谢谢

6 个答案:

答案 0 :(得分:21)

我解决了我的问题,只需更改activity_main.xml中的顺序即可。 我在DrawerLayout视图组中有一个LinearLayout视图组和NavigationView,起初我的视图组中的第一个是NavigationView,现在我改变了顺序,第一个是LinearLayout,第二个是NavigationView,它按照预期的方式工作。亲爱!!!

但有人可以告诉我它为什么会发生吗?无论显示顺序如何,视图组中的视图顺序是否重要。

答案 1 :(得分:12)

Navigation Drawer help这样说:

  

主要内容视图(上面的FrameLayout)必须是DrawerLayout中的第一个子节点,因为XML顺序意味着z排序,抽屉必须位于内容之上。

关于这个例子:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111"/>
</android.support.v4.widget.DrawerLayout>

所以这就是解释,如果由于自动生成的模板而导致布局顺序错误,那会有什么烦恼。我曾多次面对Android Studio遇到过这种“问题”,而且非常令人沮丧。

答案 2 :(得分:7)

我也有这个问题,我终于找出了什么问题,我最初创建了一个带导航抽屉的示例项目,主要活动xml如下所示,

<include
    layout="@layout/app_bar_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header_main"
    app:menu="@menu/activity_main_drawer" />

但在实际的应用程序中,我犯了这样的错误,

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header_main"
    app:menu="@menu/activity_main_drawer" />

<LinearLayout...../>
</android.support.v4.widget.DrawerLayout>

我在NavigationView下面有一个LinearLayout,这是个问题。

然后我这样做了,一切都开始正常了。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">

<LinearLayout...../>

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header_main"
    app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>

Key是将NavigationView放在最后。很奇怪UI没有被打扰但是回调是。

答案 3 :(得分:2)

我刚刚遇到了这个问题,但是没有答案可以帮助我。但最后我解决了。 就我而言,未调用监听器是因为我在活动中使用了

NavigationUI.setupWithNavController(navigationView, navController);

这会覆盖我的OnNavigationItemSelectedListener,因此我删除了该行,并将侦听器设置为以下内容:

final NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(new 
NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            FragmentManager fm = getSupportFragmentManager();
            fm.popBackStackImmediate();
            boolean handled = NavigationUI.onNavDestinationSelected(item, navController);
            if (handled) {
                ViewParent parent = navigationView.getParent();
                if (parent instanceof DrawerLayout) {
                    ((DrawerLayout) parent).closeDrawer(navigationView);
                }
            }
            return handled;
        }
    });

这是一个覆盖我的侦听器的NavigationUI:

public static void setupWithNavController(@NonNull final NavigationView navigationView,
        @NonNull final NavController navController) {
    navigationView.setNavigationItemSelectedListener(
            new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    boolean handled = onNavDestinationSelected(item, navController);
                    //******* CUTTED ***************
                    return handled;
                }
            });
}

我希望它能有所帮助。

答案 4 :(得分:0)

Navigation Drawer help这样说:

  

主要内容视图(上面的FrameLayout)必须是DrawerLayout中的第一个子,因为XML顺序意味着z排序,抽屉必须位于内容之上。

关于这个例子:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111"/>
</android.support.v4.widget.DrawerLayout>

如果由于自动生成的模板而导致布局顺序错误,那会有什么烦恼。我遇到过这种问题&#34;使用Android Studio几次,非常令人沮丧。

答案 5 :(得分:-1)

您应该更改标签的位置。不应该先做NavigationView。可以。