Android

Navigation view items will not respond when pressed

Элементы вида навигации не реагируют при нажатии

Я работаю над приложением с боковым ящиком навигации. Ящик открывается нормально, однако текст, который предположительно может быть "интерактивным", похоже, не реагирует. Анимация показывает, что при нажатии на ящик есть обратная связь (вы можете услышать звук), однако это ничего не дает. Я пытался размещать всплывающие сообщения, чтобы увидеть, регистрирует ли кнопка действие, но при нажатии всплывающее окно не появляется. Код выглядит следующим образом (я реализовал NavigationView.OnNavigationItemSelectedListener):

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

DrawerLayout drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
// 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_history, R.id.nav_settings,
R.id.nav_help, R.id.nav_signout)
.setDrawerLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);

А затем я реализовал метод:

    @Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.nav_history:
Toast.makeText(this, "fsdfuxc", Toast.LENGTH_LONG).show();
break;
case R.id.nav_help:

break;
case R.id.nav_settings:

break;
case R.id.nav_signout:
signOut();
break;
}

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

Спасибо

Переведено автоматически
Ответ 1

Строка

NavigationUI.setupWithNavController(navigationView, navController);

Вызывает setNavigationItemSelectedListener внутренний вызов для подключения пунктов назначения к пунктам меню (т. Е., Когда вы нажимаете на R.id.nav_settings MenuItem , он заменяет фрагмент в вашем NavHostFragment на фрагмент с android:id="@+id/nav_settings" set). Этот прослушиватель переопределяет OnNavigationItemSelectedListener установленное вами представление, вот почему ваша пользовательская логика не запускается.

Если вы хотите объединить оба набора функций вместе, вам нужно вызвать navigationView.setNavigationItemSelectedListener(this); after setupWithNavController и запустить поведение по умолчанию с помощью NavigationUI.onNavDestinationSelected():

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_driver_home);
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_history, R.id.nav_settings,
R.id.nav_help, R.id.nav_signout)
.setDrawerLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
// This line needs to be after setupWithNavController()
navigationView.setNavigationItemSelectedListener(this);

}

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
switch (menuItem.getItemId()){
case R.id.nav_history:
Toast.makeText(this, "fsdfuxc", Toast.LENGTH_LONG).show();
break;
case R.id.nav_signout:
signOut();
break;
default:
// Trigger the default action of replacing the current
// screen with the one matching the MenuItem's ID
NavigationUI.onNavDestinationSelected(menuItem, navController);
}

DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
Ответ 2

Просто небольшая выборка, основанная на принятом ответе, но внутри фрагмента, без переопределения аннотации и использования Kotlin.

 bottomNav.setOnNavigationItemSelectedListener {

when (it.itemId) {
R.id.share -> {
shareViaWhatsApp()
}
else -> {
NavigationUI.onNavDestinationSelected(it, navController!!)
}
}

true

}
2023-05-15 21:19 java android