Android 如何防止ActionBar菜单在选择时崩溃?

Android 如何防止ActionBar菜单在选择时崩溃?,android,checkbox,menu,Android,Checkbox,Menu,这是我的menu.xml <menu 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" tools:context=".MainActivity"> <item android:id="@+id/filter

这是我的menu.xml

<menu 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"
tools:context=".MainActivity">

<item
   android:id="@+id/filter"
    android:icon="@drawable/filter"
    app:showAsAction="always"
    android:title="Filter">

    <menu>
        <item
            android:id="@+id/action_dropdown1"
            android:title="free"
            android:checkable="true"
            app:showAsAction="always"
            android:icon="@drawable/ic_free"/>
        <item
            android:id="@+id/action_dropdown2"
            android:title="paid"
            android:icon="@drawable/ic_paid">

            <menu>
                <group android:checkableBehavior="all">

                <item
                    android:id="@+id/paid_cat1"
                    android:title="0-50"
                    android:checkable="true"
                    android:icon="@drawable/ic_paid"/>
                <item
                    android:checkable="true"
                    android:id="@+id/paid_cat2"
                    android:title="51-100"
                    android:icon="@drawable/ic_paid"/>

                <item
                    android:checkable="true"
                    android:id="@+id/paid_cat3"
                    android:title="101-500"
                    android:icon="@drawable/ic_paid"/>

                <item
                    android:checkable="true"
                    android:id="@+id/paid_cat4"
                    android:title="500-10,000"
                    android:icon="@drawable/ic_paid"/>

                <item
                    android:checkable="true"
                    android:id="@+id/paid_cat5"
                    android:title="show all"
                    android:icon="@drawable/ic_paid"/>

                </group>

            </menu>
            </item>

        <item

            android:id="@+id/action_find"
            android:title="find"
            android:icon="@drawable/ic_search_black_24dp"/>

    </menu>
    </item>

<item
    android:id="@+id/action_search"
    android:icon="@android:drawable/ic_menu_search"
    app:showAsAction="always"
    app:actionViewClass="android.support.v7.widget.SearchView"
    android:title="Search"/>

我想实现的是,当用户点击菜单中的复选框时,他们应该能够选择多个菜单项。。。但我一点击它就消失了


或者,是否有更好的替代方案来实现我所想到的使用微调器的效果,但它的行为相同

您可以使用弹出式菜单,自定义布局定位到菜单项。
单击“付费”菜单项时显示弹出菜单-

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
        case R.id.action_dropdown2:
            showPopUp();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

public void showPopUp() {
    View mPopUpView = LayoutInflater.from(this).inflate(R.layout.checkable_items, null);
     PopupWindow mPopupWindow = new PopupWindow(
            mPopUpView,
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    mPopupWindow.setOutsideTouchable(true);
    mPopupWindow.setFocusable(true);
    mPopupWindow.setBackgroundDrawable(new ColorDrawable());
    // Set content width and height
    mPopupWindow.setHeight(convertDpToPx(140));
    mPopupWindow.setWidth(convertDpToPx(120));
    mPopupWindow.showAsDropDown(this.findViewById(R.id.filter), convertDpToPx(-20), convertDpToPx(-40));
}

int convertDpToPx(int dp){
    return   (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}
这是可检查的自定义布局\u items.xml-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@android:color/white"
android:orientation="vertical">

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="0-50" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="51-100" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="101-500" />

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="500-10,000" />

</LinearLayout>

将菜单文件更新为-

<?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"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">

<item
    android:id="@+id/filter"
    android:icon="@android:drawable/ic_dialog_email"
    android:title="Filter"
    app:showAsAction="always">

    <menu>
        <item
            android:id="@+id/action_dropdown1"
            android:checkable="true"
            android:icon="@android:drawable/btn_dialog"
            android:title="free"
            app:showAsAction="always" />
        <item
            android:id="@+id/action_dropdown2"
            android:icon="@android:drawable/btn_minus"
            android:title="paid">

        </item>

        <item

            android:id="@+id/action_find"
            android:icon="@android:drawable/ic_dialog_email"
            android:title="find" />

    </menu>
</item>

<item
    android:id="@+id/action_search"
    android:icon="@android:drawable/ic_menu_search"
    android:title="Search"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always" />
</menu>

您可以随时使用mpoppupWindow.Disclose()关闭弹出窗口。希望这对您有所帮助


它可以工作,但图标在弹出窗口中不可见,因为它们在菜单中可见。但在弹出窗口中,图标是不可见的。基本上,我们在这里做的是当菜单关闭时,我们显示的是弹出窗口,它看起来完全不同。无论如何,有没有防止菜单被关闭。任何帮助都会显示在弹出窗口中图标不可见-这是一个自定义布局。因此,您可以在左侧添加图标,并将复选框向右移动,使其完全符合您的需要。当“菜单关闭”时,我们显示的是弹出窗口,它看起来完全不同-当您早些时候单击“付费”时,它看起来不一样吗?它关闭菜单并打开子菜单。它完成任务。但当我点击popwindow的项目时,它会自动关闭,因为菜单不允许我进行多次选择。如何解决这个问题?