在上下文操作栏中创建弹出选项菜单

lim*_*lim 5 android popupmenu android-optionsmenu contextual-action-bar

我有一个带有NoActionBar主题的应用程序.在我的主要活动中,我有一个选项菜单,我在屏幕顶部手动创建(或使用内置设备的选项按钮).

在这个主要活动中,我有一个带有listView片段,我在其中应用了动作模式长按功能,以显示上下文操作栏(CAB)以获取更多用户选项.

现在,我尝试向我的CAB添加一个选项,因此它将包含一些选项,例如选择listView中的所有项目,但由于它是CAB的一个项目,我无法像常规活动那样真正显示弹出菜单.此外,我希望所有选项菜单回调(例如onOptionsItemSelected)保留在CAB的上下文中,以便能够继续在CAB上执行操作.

这是我的CAB的代码:

<?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/action_delete"
        android:orderInCategory="100"
        app:showAsAction="always"
        android:icon="@drawable/ic_action_delete"
        android:title="Delete"/>

    <item
        android:id="@+id/action_overflow"
        app:showAsAction="always"
        android:orderInCategory="200"
        android:icon="@drawable/ic_action_overflow"
        android:title="Options"
        android:visible="false"/>

</menu>
Run Code Online (Sandbox Code Playgroud)

lim*_*lim 2

显然我错过了 CAB 的内置功能 - 内置的溢出菜单,一旦屏幕太小而无法全部显示,就会折叠某些操作的项目。

为了始终折叠溢出菜单下的某些操作,需要执行的另一种操作是为每个操作进行设置:

android:showAsAction="never"
app:showAsAction="never"
Run Code Online (Sandbox Code Playgroud)

因此,假设我们在 CAB 中有 3 个操作(delete、selece_all、add),并且我们希望其中两个操作(select_all、add)始终折叠在内置溢出菜单下,我们将在 CAB 的 xml 中进行设置:

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

<item
    android:id="@+id/action_delete"
    android:orderInCategory="100"
    mm:showAsAction="always"
    android:icon="@drawable/ic_action_delete"
    android:title="Delete"/>

<item
    android:id="@+id/action_select"
    android:orderInCategory="200"
    android:showAsAction="never"
    mm:showAsAction="never"
    android:title="@string/select_all"/>

<item
    android:id="@+id/action_add"
    android:orderInCategory="300"
    android:showAsAction="never"
    mm:showAsAction="never"
    android:title="@string/button_add"/>
Run Code Online (Sandbox Code Playgroud)