2017-03-21 10 views
1

チェックボックスがたくさんあるオプションメニューがあります。私はそれらの束をオンまたはオフにチェックしたいと思いますが、メニューをチェックするたびに自動的にメニューが閉じます。アイテムが選択されているときにメニューが閉じないようにすることはできますか?閉鎖が起こったときとそれが防止されたときに、私はまたを制御したいと思う。OptionsItemSelectedを閉じるオプションメニューを無効にする

<?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> 
+0

は、あなたがこのような何かをしようとしたんでしたか? http://stackoverflow.com/questions/29726039/how-to-prevent-popup-menu-from-closing-on-checkbox-click/ – zkminusck

+0

@zkminusck私はその質問に気づきましたが、解決を難しくしていましたC#とXamarinに。 – vipirtti

答えて

1

actions.xml

(オプションメニューに関連していないすべてのものを除く)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); 
    } 
} 

私はそれでチェックボックスの束とオプションメニューを得ました。私はそれらの束をオンまたはオフにチェックしたいと思いますが、メニューをチェックするたびに自動的にメニューが閉じます。アイテムが選択されているときにメニューが閉じないようにすることはできますか?私はまた、閉鎖がいつ起こるのか、それが妨げられるのかをコントロールしたいと思う。

メニューでは、クローズ動作を制御する適切な方法が見つかりませんでした。

しかし、あなたの要件のために、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. は、あなたの作成DialogFragmentと一緒にAlertDialog

    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"); 
        } 
    } 
    
+0

私はそれを恐れていました。実装の詳細な説明をありがとう。私はまだこのソリューションを適切にテストする時間がありませんが、いったんやったら、これに戻ります。 – vipirtti

関連する問題