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 в первую очередь. оно работает.