OnNavigationItemSelected не получает вызов

Я реализовал навигационное представление в своем приложении, которое было автоматически создано 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

Пожалуйста, помогите мне, спасибо.

Ответ 1

Я решил свой вопрос, просто изменил порядок в свой Activity_main.xml. У меня есть группа просмотра LinearLayout и NavigationView в моей группе просмотра DrawerLayout, сначала NavigationView является первой в моей группе просмотра, и теперь я меняю порядок, первый - LinearLayout, а второй - NavigationView, и он работает так, как предполагается. Уважаемый!!!

Но может кто-нибудь сказать мне, почему это произошло? Имеет ли значение порядок просмотра в группе просмотра независимо от последовательности отображения.

Ответ 2

Навигационный ящик помогает сказать это:

Основное представление контента (выше 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 несколько раз, и это очень утомительно.

Ответ 3

У меня тоже была эта проблема, и я, наконец, понял, что не так, я изначально создал образец проекта с навигационным ящиком, а основной вид активности 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>

У меня был LinearLayout ниже NavigationView, который был проблемой.

Затем я сделал это, все стало нормально работать.

<?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>

Ключ должен был поместить NavView наконец. Странно, что пользовательский интерфейс не был нарушен, но обратный вызов был.

Ответ 4

Справка по навигационному ящику скажите это:

Основной вид содержимого (вышеописанный 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 несколько раз и настолько впечатляюще.

Ответ 5

Вы должны изменить место тегов. не должен делать NavigationView в первую очередь. оно работает.