在 android 的工具栏中使用 app:menu 时,我找不到菜单项
when using app:menu in android's Toolbar I cannot locate the menu items
我正在尝试使用以下 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)
它 returns 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,在内部搜索时 build/generated 指向
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) 放在代码中运行 它会工作,即使它在调试时不起作用
您需要在 activity 中添加:onCreateOptionsMenu(Menu menu) 和 onOptionsItemSelected(MenuItem item),如下所示:
第一种方法,它用来膨胀菜单。
@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);
}
您可以像这样在项目上设置点击监听器:
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;
}
});
给你。
我正在尝试使用以下 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)
它 returns 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,在内部搜索时 build/generated 指向
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) 放在代码中运行 它会工作,即使它在调试时不起作用
您需要在 activity 中添加:onCreateOptionsMenu(Menu menu) 和 onOptionsItemSelected(MenuItem item),如下所示:
第一种方法,它用来膨胀菜单。
@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);
}
您可以像这样在项目上设置点击监听器:
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;
}
});
给你。