使用setOnMenuItemClickListener时,空对象引用

时间:2019-02-06 02:34:38

标签: android

我正在尝试访问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函数中。

2 个答案:

答案 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);
    }