android - 使用应用程序 :menu in android's Toolbar I cannot locate the menu items 时

标签 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)

我也得到null

然而,当我检查 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不起作用

编辑 2:对于那些可能遇到这种情况的人来说,似乎在评估和调试期间资源编号确实不同,但是如果您实际上将 mToolbar.menu.findItem(R.id.search_reports) 放在代码中并运行它,它会工作,即使它在调试时不起作用

最佳答案

您可以像这样在项目上设置点击监听器:

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

给你。

关于android - 使用应用程序 :menu in android's Toolbar I cannot locate the menu items 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59406450/

相关文章:

python - pip install matplotlib 在 termux (Android) 下不起作用

android - 如何在画廊中的图像之间创建空间?

android:onClick 在 xml 中的 menuitem 上设置

android - Android中的日期和时间更改监听器?

android - 如何计算字符串的宽度

android - 如何通过resValue添加文本翻译

android - R.Id.在 android 项目中使用 maven 生成的 apklib 时丢失

Android:如何将矢量可绘制图像加载到 WebView 中?

android - 在 oncreate 或 onresume 中获取 menuitem

android - 获取 TapTargetView 的 MenuItem View 引用