防止选项菜单关闭 OptionItemSelected

Prevent options menu from closing on OptionItemSelected

我有一个选项菜单,里面有一堆复选框。我想打开或关闭其中的一堆,但每次我只选中一个时菜单都会自动关闭。我可以在选择项目后阻止菜单关闭吗?我还想控制 何时 关闭发生以及何时被阻止。

Activity.cs(不包括与选项菜单无关的所有内容)

public class Activity: ReactiveActivity<ViewModel>, IAppCompatCallback
{

    public override bool OnCreateOptionsMenu(IMenu menu)
    {
        var inflater = MenuInflater;
        inflater.Inflate(Resource.Menu.actions, menu);
        return true;
    }

    public override bool OnOptionsItemSelected(IMenuItem item)
    {
        if(item.ItemId == Resource.Id.action_settings) {
           StartActivity(typeof(SettingsActivity));
        }
        else {
           //Code changing the view based on selections
        }
        return base.OnOptionsItemSelected(item);
    }
}

actions.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:title="Choose options...">
  <menu>
    <group android:checkableBehavior="all">
      <item android:id="@+id/checkOption1"
            android:title="Option 1" 
            android:checked="true" />
      <item android:id="@+id/checkOption2"
            android:title="Option 2"
            android:checked="true" />
      <item android:id="@+id/checkOption3"
            android:title="Option 3"
            android:checked="true" />
      <item android:id="@+id/checkOption4"
            android:title="Option 4"
            android:checked="true" />
      <item android:id="@+id/checkOption5"
            android:title="Option 5"
            android:checked="true" />
      <item android:id="@+id/checkOption6"
            android:title="Option 6"
            android:checked="true" />
      <item android:id="@+id/checkOption7"
            android:title="Option 7"
            android:checked="true" />
    </group>
  </menu>
  </item>
  <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:showAsAction="never"/>
</menu>

I got an options menu with a bunch of checkboxes in it. I'd like to check a bunch of them on or off, but the menu closes automaticly every time I check just one. Can I prevent the menu from closing when an item has been selected? I'd also want to control when the closing happens and when it's prevented.

对于菜单,我没有找到控制关闭行为的正确方法。

但根据您的要求,Dialog 是更好的选择:

  1. 删除 action.xml 中的子菜单并为 Choose Options... 项添加一个 id:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
      <item android:title="Choose options..." android:id="@+id/chooseOption"></item>
      <item android:id="@+id/action_settings"
            android:title="Settings"
            android:showAsAction="never"/>
    </menu>
    
  2. AlertDialog 一起创建您的 DialogFragment:

    public class MyDialogFragment:DialogFragment
    {
        string[] Items { get; set; }
        bool[] CheckedItems { get; set; }
    
        public MyDialogFragment(string[] items,bool[] checkedItems)
        {
            Items = items;
            checkedItems = checkedItems;
        }
        public override Dialog OnCreateDialog(Bundle savedInstanceState)
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(this.Activity);
            builder.SetMultiChoiceItems(Items, CheckedItems, new DialogItemClickhandler());
            // Create the AlertDialog object and return it
            return builder.Create();
        } 
    }
    
    public class DialogItemClickhandler : Java.Lang.Object, IDialogInterfaceOnMultiChoiceClickListener
    {
        public void OnClick(IDialogInterface dialog, int which, bool isChecked)
        {
           //Item Click Implementation
        }
    }
    
  3. 当用户单击 Choose Options... 菜单项时打开对话框:

    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView (Resource.Layout.Main);
        }
    
    
        public override bool OnCreateOptionsMenu(IMenu menu)
        {
            MenuInflater.Inflate(Resource.Menu.Actions, menu);
            return true;
        }
    
        public override bool OnMenuItemSelected(int featureId, IMenuItem item)
        {
            switch (item.ItemId)
            {
                case Resource.Id.chooseOption:
                    OpenDialogFragment();//Open the dialog
                    break;
                default:break;
            }
            return true;
        }
    
        private void OpenDialogFragment()
        {
    
            //init the Dialog items
            string[] items = new string[] {
                "Options 1",
                "Options 2",
                "Options 3",
                "Options 4",
                "Options 5",
                "Options 6"
            };
    
            bool[] checkedItems = new bool[] {
                true,
                false,
                true,
                false,
                true,
                false
            };
            MyDialogFragment dialog = new MyDialogFragment(items,checkedItems);
            dialog.Show(FragmentManager, "tag");
        }
    }
    

我的情况是一样的,带有复选框的菜单项。

我没有找到阻止它关闭的方法,但作为黑客,我在选项菜单关闭后立即重新打开它,但有一个问题我不知道如何解决,同时打开和关闭选项菜单时有一个动画,我无法找到禁用它的方法,甚至环顾四周并找到可能的答案,都失败了。

在我们的应用程序中,我们创建了一个 Toolbar 并将其设置为 ActionBar,然后在您的代码中覆盖此方法并调用 toolbar.showOverflowMenu() 重新打开菜单:

/**
 * Handles the overflow menu closing event
 *
 * Due to a possible Android bug this is called twice!
 */
override fun onPanelClosed(featureId: Int, menu: Menu)
{
    if (something)    toolbar.showOverflowMenu()
}

您应该使用一些规则来避免像示例中的 if 语句那样不停地打开菜单。

在复选框之后的菜单本身上,我添加了一个 OK 按钮,当用户单击它时,我更改了一个布尔值(示例中的某些内容)并避免再次重新打开菜单。