在android工具栏中使用app:menu时,我找不到菜单项

时间:2019-12-19 09:12:44

标签: android android-resources menuitem

我正在尝试使用以下xml为我的工具栏充气

<com.google.android.material.appbar.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true">

    <com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        style="?toolbarStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:menu="@menu/report_list"
        app:navigationIcon="@drawable/ic_nav_back"
        app:subtitle="@string/select_create_report"
        app:title="@string/damage_reports" />
</com.google.android.material.appbar.AppBarLayout>

我可以像这样在膨胀的xml中找到工具栏:

mToolbar = findViewById(R.id.toolbar)

并且菜单正确显示

我的问题是,由于我没有通过onCreateOptionsMenu使工具栏膨胀,所以无法使用onOptionsItemSelected处理事件。

所以我决定将直接的侦听器添加到不同的菜单项。

但是问题是,当我使用它们时,我无法获得对它们的引用

 mToolbar.findViewById(R.id.search_reports)

它返回null(坦率地说,这是我期望的),但是当我还使用

mToolbar.menu.findItem(R.id.search_reports)

我也会得到空值

但是,当我检查mToolbar.actionItems [0]时,我发现SearchView的字符串表示形式显示其ID为

androidx.appcompat.widget.SearchView{c1aeba0 VFE...... ......I. 0,0-0,0 #7f0800fb app:id/search_reports}

该操作项的mId为2131230971,它转换为7F0800FB,当在内部生成/生成的点中进行搜索时,该指向

public static final int search_reports=0x7f0800fb;

但是当我检查R.id.search_reports而不是2131230971(这会使findMenuItem工作)时,我得到-1000038

我的应用程序设置有问题吗?还是有其他方法可以找到特定的菜单项

编辑:作为旁注,这似乎可行

mToolbar.setOnMenuItemClickListener(this::menuItemClicked)

private fun menuItemClicked(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.search_reports -> {
            vm.search_stuff()
            true
        }
        else -> false
    }

但是我仍然想知道为什么findItem无法正常工作

edit 2:对于可能发生的情况,似乎在评估和调试期间资源编号确实不同,但是如果您实际上将mToolbar.menu.findItem(R.id.search_reports)放入代码中并运行它,即使在调试时不起作用,它也会起作用

2 个答案:

答案 0 :(得分:-1)

您需要像这样在活动中添加:onCreateOptionsMenu(菜单菜单)和onOptionsItemSelected(MenuItem项目):

用于膨胀菜单的第一种方法。

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);
        return true;
    }

第二个添加侦听器的

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_share) {
            // YOUR CODE HERE ...
            return true;
        } else if (id == R.id.action_save) {
            // YOUR CODE HERE ...
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

答案 1 :(得分:-1)

您可以在以下项目上设置点击监听器:

    Toolbar toolbar = findViewById(R.id.toolbar);

    //remember your menu item id !! mine is R.id.psMenuRefresh

    toolbar.getMenu().findItem(R.id.psMenuRefresh).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem menuItem) {
            Log.i("mytag","helooo");
            return false;
        }
    });

你去了。