溢出菜单在活动中的工具栏上不起作用

Overflow menu not working on toolbar in activity

提问人:Shivanshu Raj 提问时间:9/8/2023 更新时间:9/11/2023 访问量:34

问:

我已经在 MainActivity 中设置了一个工具栏。我可以创建选项菜单。但是,当我单击该项目时,没有任何反应。我想在单击菜单项时打开一个片段。我正在使用应用导航模式。

我尝试将工具栏设置为supportActionToolbar,但它不起作用。我尝试在工具栏上膨胀菜单,然后使用工具栏的 setOnMenuItemClick 侦听器,但这似乎也不起作用。

代码如下:

MainActivity.java

Toolbar toolbar = binding.toolbar;
toolbar.setTitle("Howdy John Doe !!");
toolbar.setSubtitle("Mumbai");
toolbar.setSubtitleTextColor(getResources().getColor(R.color.white, getTheme()));
toolbar.setTitleTextColor(getResources().getColor(R.color.white, getTheme()));
setSupportActionBar(toolbar);


@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if(item.getItemId()==R.id.navigation_refine){
            Toast.makeText(this, "Hey there", Toast.LENGTH_SHORT).show();
            Log.d(TAG, "onOptionsItemSelected: Its working!");
        }
        return super.onOptionsItemSelected(item);
    }



activity_main.xml:


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="@color/blue_200"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nav_view"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/bottom_nav_menu" />

    <fragment
        android:id="@+id/nav_host_fragment_activity_main"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toTopOf="@id/nav_view"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar"
        app:navGraph="@navigation/mobile_navigation" />



</androidx.constraintlayout.widget.ConstraintLayout>




menu_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/navigation_refine"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:showAsAction="always"
        app:actionLayout="@layout/custom_menu_layout"
        android:icon="@drawable/mdi_format_list_checks"
        android:title="Refine" />
</menu>
java android-工具栏 android-选项菜单

评论


答:

1赞 Pawan Harariya 9/8/2023 #1

将语句添加到 中的所有条件。它表示您已成功处理菜单项。return trueonOptionsItemSelected()

@Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if(item.getItemId()==R.id.navigation_refine){
            Toast.makeText(this, "Hey there", Toast.LENGTH_SHORT).show();
            Log.d(TAG, "onOptionsItemSelected: Its working!");
            return true;    // add this to your code
        }
        return super.onOptionsItemSelected(item);
    }

如果对菜单使用自定义布局,则默认情况下不会调用。因此,您需要实现点击侦听器。您可以按照本教程了解更多详细信息。onOptionsItemSelected()

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        final MenuItem menuItem = menu.findItem(R.id.navigation_refine);
        View rootView =  menuItem.getActionView();

        rootView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onOptionsItemSelected(menuItem);
            }
        });

        return super.onPrepareOptionsMenu(menu);
    }

评论

0赞 Shivanshu Raj 9/8/2023
这个解决方案没有用。
0赞 Pawan Harariya 9/8/2023
单击项目时,屏幕上是否显示“嘿,你好”Toast消息?
0赞 Shivanshu Raj 9/11/2023
此行导致了问题:app:actionLayout=“@layout/custom_menu_layout”。但是,现在我无法对菜单项使用自定义布局。
1赞 Pawan Harariya 9/11/2023
如果您使用的是自定义布局,则默认情况下不会实现。我已经更新了我的答案。ClickListener