导航抽屉项目点击监听器不工作
Navigation drawer item click listener not working
很抱歉我在 android 工作室业余学习这个愚蠢的问题。
我已经尝试了很多,但点击侦听器无法正常工作请帮忙。
我已经使用了 android 工作室的默认抽屉 layout.navigation 正在工作,但我想执行一个特殊的操作,例如使用新的意图打开另一个 app.I 我正在尝试在 ID nav_link 执行简单的 toast 但它不起作用。
package com.demo.navdraw;
import android.content.ClipData;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.navigation.NavigationView;
import com.google.android.material.snackbar.Snackbar;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private AppBarConfiguration mAppBarConfiguration;
private MenuItem item;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main_drawer, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.nav_link) {
Toast.makeText(this, "Setting", Toast.LENGTH_LONG).show();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar=findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab=findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
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_gallery, R.id.nav_slideshow,
R.id.nav_tools, R.id.nav_share, R.id.nav_send, R.id.nav_profile, R.id.nav_link)
.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 onSupportNavigateUp() {
NavController navController=Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem Item) {
int id=item.getItemId();
if (id==R.id.nav_link){
Toast.makeText(getApplicationContext(), "Link", Toast.LENGTH_LONG).show();
return true;
}
return true;
}
}
你可以试试这个,你需要手动做一些事情,但这是做你想做的事情的代价。这是你需要做的:
- 删除NavigationView.OnNavigationItemSelectedListener的实现,就不需要了
- 调用后:
NavigationUI.setupWithNavController(navigationView, navController);
插入此代码段:
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
int id=menuItem.getItemId();
//it's possible to do more actions on several items, if there is a large amount of items I prefer switch(){case} instead of if()
if (id==R.id.nav_home){
Toast.makeText(getApplicationContext(), "Home", Toast.LENGTH_SHORT).show();
}
//This is for maintaining the behavior of the Navigation view
NavigationUI.onNavDestinationSelected(menuItem,navController);
//This is for closing the drawer after acting on it
drawer.closeDrawer(GravityCompat.START);
return true;
}
});
我已经为主页片段制作了自己的片段,但您可以使用自己的 "link" 片段来完成
请注意,变量名称可以更改,但想法是相同的
您可以采用两种方法。
第一种方法
是使用 setOnMenuItemClickListener 当您只想为单个项目实现侦听器时导航抽屉。这会为导航抽屉中的单个项目添加一个侦听器,而不会影响其他导航项目。
val navigationView: NavigationView = findViewById(R.id.nav_view) as NavigationView
navigationView.menu!!.findItem(R.id.nav_logout).setOnMenuItemClickListener { menuItem:MenuItem? ->
//write your implementation here
//to close the navigation drawer
if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
drawer_layout.closeDrawer(GravityCompat.START)
}
Toast.makeText(applicationContext, "single item click listener implemented", Toast.LENGTH_SHORT).show()
true
}
第二种方法
当您想为导航抽屉中的每个项目编写侦听器时,将使用 setNavigationItemSelectedListener。
val navigationView: NavigationView = findViewById(R.id.nav_view) as NavigationView
navigationView.setNavigationItemSelectedListener { menuItem ->
when (menuItem.itemId) {
R.id.nav_gallery -> {
//write your implementation here
if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
drawer_layout.closeDrawer(GravityCompat.START)
}
true
}
else -> {
if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
drawer_layout.closeDrawer(GravityCompat.START)
}
false
}
}
}
对于 Kotlin,
bottom_navigation.setOnItemSelectedListener {
when(it.itemId) {
R.id.page_1 -> {
// Respond to navigation item 1 click
Toast.makeText(this,"Home Clicked",Toast.LENGTH_SHORT).show()
true
}
R.id.page_2 -> {
// Respond to navigation item 2 click
true
}
R.id.page_3 -> {
// Respond to navigation item 2 click
true
}
R.id.page_4 -> {
// Respond to navigation item 2 click
true
}
else -> false
}
}
.OnNavigationItemSelectedListener 已弃用
导航项点击有两种方式
第一种方式:-
如果你想在点击导航抽屉项目后显示片段,那么你可以按照一些简单的步骤来实现。
您必须创建一个导航图。了解更多信息 Click here
您必须提供 菜单项 和 片段的 id导航图 相同。
查看此图片:- Menu Item ID
查看此图片:- Navigation Graph - Fragment ID
DrawerLayout drawer = binding.drawerLayout;
NavigationView navigationView = binding.navView;
// 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.home, R.id.gallery, R.id.nav_slideshow)
.setOpenableLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main3);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
当两个id相同时,您的导航视图将根据id处理您的导航项点击。
第二种方式:-
如果你想在点击导航抽屉项目后显示自定义的东西,那么你可以实现导航项目点击监听器。
navigationView.setNavigationItemSelectedListener(item -> {
if (item.getItemId()==R.id.home){
// your code
Toast.makeText(this, "Clicked..", Toast.LENGTH_SHORT).show();
drawer.close();
return true;
}
return false;
});
很抱歉我在 android 工作室业余学习这个愚蠢的问题。 我已经尝试了很多,但点击侦听器无法正常工作请帮忙。 我已经使用了 android 工作室的默认抽屉 layout.navigation 正在工作,但我想执行一个特殊的操作,例如使用新的意图打开另一个 app.I 我正在尝试在 ID nav_link 执行简单的 toast 但它不起作用。
package com.demo.navdraw;
import android.content.ClipData;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.navigation.NavigationView;
import com.google.android.material.snackbar.Snackbar;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private AppBarConfiguration mAppBarConfiguration;
private MenuItem item;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main_drawer, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.nav_link) {
Toast.makeText(this, "Setting", Toast.LENGTH_LONG).show();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar=findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab=findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
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_gallery, R.id.nav_slideshow,
R.id.nav_tools, R.id.nav_share, R.id.nav_send, R.id.nav_profile, R.id.nav_link)
.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 onSupportNavigateUp() {
NavController navController=Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem Item) {
int id=item.getItemId();
if (id==R.id.nav_link){
Toast.makeText(getApplicationContext(), "Link", Toast.LENGTH_LONG).show();
return true;
}
return true;
}
}
你可以试试这个,你需要手动做一些事情,但这是做你想做的事情的代价。这是你需要做的:
- 删除NavigationView.OnNavigationItemSelectedListener的实现,就不需要了
- 调用后:
NavigationUI.setupWithNavController(navigationView, navController);
插入此代码段:
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
int id=menuItem.getItemId();
//it's possible to do more actions on several items, if there is a large amount of items I prefer switch(){case} instead of if()
if (id==R.id.nav_home){
Toast.makeText(getApplicationContext(), "Home", Toast.LENGTH_SHORT).show();
}
//This is for maintaining the behavior of the Navigation view
NavigationUI.onNavDestinationSelected(menuItem,navController);
//This is for closing the drawer after acting on it
drawer.closeDrawer(GravityCompat.START);
return true;
}
});
我已经为主页片段制作了自己的片段,但您可以使用自己的 "link" 片段来完成 请注意,变量名称可以更改,但想法是相同的
您可以采用两种方法。
第一种方法
是使用 setOnMenuItemClickListener 当您只想为单个项目实现侦听器时导航抽屉。这会为导航抽屉中的单个项目添加一个侦听器,而不会影响其他导航项目。
val navigationView: NavigationView = findViewById(R.id.nav_view) as NavigationView
navigationView.menu!!.findItem(R.id.nav_logout).setOnMenuItemClickListener { menuItem:MenuItem? ->
//write your implementation here
//to close the navigation drawer
if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
drawer_layout.closeDrawer(GravityCompat.START)
}
Toast.makeText(applicationContext, "single item click listener implemented", Toast.LENGTH_SHORT).show()
true
}
第二种方法
当您想为导航抽屉中的每个项目编写侦听器时,将使用 setNavigationItemSelectedListener。
val navigationView: NavigationView = findViewById(R.id.nav_view) as NavigationView
navigationView.setNavigationItemSelectedListener { menuItem ->
when (menuItem.itemId) {
R.id.nav_gallery -> {
//write your implementation here
if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
drawer_layout.closeDrawer(GravityCompat.START)
}
true
}
else -> {
if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
drawer_layout.closeDrawer(GravityCompat.START)
}
false
}
}
}
对于 Kotlin,
bottom_navigation.setOnItemSelectedListener {
when(it.itemId) {
R.id.page_1 -> {
// Respond to navigation item 1 click
Toast.makeText(this,"Home Clicked",Toast.LENGTH_SHORT).show()
true
}
R.id.page_2 -> {
// Respond to navigation item 2 click
true
}
R.id.page_3 -> {
// Respond to navigation item 2 click
true
}
R.id.page_4 -> {
// Respond to navigation item 2 click
true
}
else -> false
}
}
.OnNavigationItemSelectedListener 已弃用
导航项点击有两种方式
第一种方式:- 如果你想在点击导航抽屉项目后显示片段,那么你可以按照一些简单的步骤来实现。
您必须创建一个导航图。了解更多信息 Click here
您必须提供 菜单项 和 片段的 id导航图 相同。
查看此图片:- Menu Item ID
查看此图片:- Navigation Graph - Fragment ID
DrawerLayout drawer = binding.drawerLayout;
NavigationView navigationView = binding.navView;
// 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.home, R.id.gallery, R.id.nav_slideshow)
.setOpenableLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main3);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
当两个id相同时,您的导航视图将根据id处理您的导航项点击。
第二种方式:- 如果你想在点击导航抽屉项目后显示自定义的东西,那么你可以实现导航项目点击监听器。
navigationView.setNavigationItemSelectedListener(item -> {
if (item.getItemId()==R.id.home){
// your code
Toast.makeText(this, "Clicked..", Toast.LENGTH_SHORT).show();
drawer.close();
return true;
}
return false;
});