防止选项菜单关闭 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
是更好的选择:
删除 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>
与 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
}
}
当用户单击 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 按钮,当用户单击它时,我更改了一个布尔值(示例中的某些内容)并避免再次重新打开菜单。
我有一个选项菜单,里面有一堆复选框。我想打开或关闭其中的一堆,但每次我只选中一个时菜单都会自动关闭。我可以在选择项目后阻止菜单关闭吗?我还想控制 何时 关闭发生以及何时被阻止。
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
是更好的选择:
删除 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>
与
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 } }
当用户单击
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 按钮,当用户单击它时,我更改了一个布尔值(示例中的某些内容)并避免再次重新打开菜单。