我正在尝试访问setOnMenuItemClickedListener,但得到的是空对象引用。错误消息不是很具体,并且不会告诉我哪个对象导致了空引用。我已经使用findViewById明确定义了MenuItem对象。菜单项本身位于“ android.support.v4.widget.DrawerLayout”中,它是主要活动的根。
MenuItem item1 = findViewById(R.id.restore);
item1.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return false;
}
});
上面的所有代码都在mainactivites oncreate bundle函数中。
答案 0 :(得分:0)
响应抽屉菜单项单击的正确方法是在活动中实现NavigationView.OnNavigationItemSelectedListener
界面。
然后您将抽屉配置为使用活动通过onCreate()方法中的以下代码进行回调
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
然后您可以响应添加到活动中的onNavigationItemSelected方法中单击的菜单项。方法示例如下:
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
// Handle navigation view item clicks here.
switch (item.getItemId()) {
case R.id.restore: {
//do somthing
break;
}
}
//close navigation drawer
mDrawerLayout.closeDrawer(GravityCompat.START);
return true;
}
答案 1 :(得分:0)
我有一个具有相同目的的示例项目,以使侦听器显示菜单上的项目。希望这会有所帮助
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem menuItem = menu.findItem(R.id.action_cart);
FrameLayout rootView = (FrameLayout) menuItem.getActionView(); // --> access like this
ImageView imItemCount = rootView.findViewById(R.id.cart_badge);
count = mainPresenter.checkNumCart();
new QBadgeView(getApplicationContext())
.bindTarget(imItemCount)
.setShowShadow(true)
.setBadgeGravity(Gravity.TOP | Gravity.END)
.setBadgeNumber(count);
rootView.setOnClickListener(view -> {
onOptionsItemSelected(menuItem);
});
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.action_cart:
if(count > 0){
startActivity(new Intent(MainActivity.this, OrderProductActivity.class));
}else {
DesignUtil.showSimpleNotificationDialog(this, null, getString(R.string.cart_empty));
}
return true;
}
return super.onOptionsItemSelected(item);
}