android使用menu需要重写的方法,Android – 正确使用invalidateOptionsMenu()
我一直在關注invalidateOptionsMenu() ,我知道它的作用。 但是我想不出這個方法可能有用的任何現實生活中的例子。
我的意思是,例如,假設我們想要為ActionBar添加一個新的MenuItem ,我們可以從onCreateOptionsMenu(Menu menu)獲取菜單,并在任何按鈕的操作中使用它。
現在我真正的問題是,遵循使用invalidateOptionsMenu()的唯一方法?
bool _OtherMenu; protected override void OnCreate (Bundle bundle) { _OtherMenu = false; base.OnCreate (bundle); SetContentView (Resource.Layout.Main); Button button = FindViewById(Resource.Id.myButton); button.Click += delegate { if(_OtherMenu) _OtherMenu = false; else _OtherMenu = true; InvalidateOptionsMenu (); }; } public override bool OnCreateOptionsMenu (IMenu menu) { var inflater = this.SupportMenuInflater; if(_OtherMenu) inflater.Inflate (Resource.Menu.another_menu, menu); else inflater.Inflate (Resource.Menu.main_activity_menu, menu); return base.OnCreateOptionsMenu (menu); }
單擊按鈕,將出現另一個菜單。 再次單擊該按鈕,將出現上一個菜單。
PS對不起C#語法。
invalidateOptionsMenu()用于表示Android,菜單內容已更改,菜單應重新繪制。 例如,單擊在運行時添加另一個菜單項的按鈕,或隱藏菜單項組。 在這種情況下,您應該調用invalidateOptionsMenu() ,以便系統可以在UI上重繪它。 此方法是操作系統調用onPrepareOptionsMenu()的信號,您可以在其中實現必要的菜單操作。 此外, OnCreateOptionsMenu()在活動(片段)創建期間僅調用一次,因此此方法無法處理運行時菜單更改。
所有都可以在文檔中find:
在系統調用onCreateOptionsMenu()之后,它會保留您填充的菜單的實例,并且不會再次調用onCreateOptionsMenu(),除非由于某種原因菜單失效。 但是,您應該僅使用onCreateOptionsMenu()來創建初始菜單狀態,而不是在活動生命周期中進行更改。
如果要根據活動生命周期中發生的事件修改選項菜單,可以在onPrepareOptionsMenu()方法中執行此操作。 此方法會將Menu對象傳遞給當前存在,以便您可以對其進行修改,例如添加,刪除或禁用項目。 (片段還提供onPrepareOptionsMenu()回調。)
在Android 2.3.x及更低版本中,每次用戶打開選項菜單(按菜單按鈕)時,系統都會調用onPrepareOptionsMenu()。
在Android 3.0及更高版本中,當操作欄中顯示菜單項時,選項菜單被視為始終打開。 當事件發生并且您想要執行菜單更新時,必須調用invalidateOptionsMenu()以請求系統調用onPrepareOptionsMenu()。
使用此命令在應用程序生命周期中重新加載新菜單:
ActivityCompat.invalidateOptionsMenu(getActivity());
你需要重寫onPrepareOptionsMenu()方法,用同樣的方法編寫動作菜單的更新代碼,如果你使用的是片段,那么添加setHasOptionsMenu(true); 在onCreateView() 。
希望它能幫到你
我發現的一個用途是強制onResume和onCreateOptionsMenu/onPrepareOptionsMenu之間的操作順序。 自然順序(至少從平臺22開始)似乎會翻轉,特別是在重新定位設備時。
在onResume ()中調用invalidateOptionsMenu (),你將保證在onResume之后調用onPrepareOptionsMenu (之前可能另外調用它)。 例如,這將允許基于onResume檢索的數據啟用菜單項。
編輯:這是一個更好的答案問題。
對于invalidateOptionsMenu()一個很好的用途是當我們有一個ListView和Delete All MenuItem時,所以當ListView為空時我們應該使用invalidateOptionsMenu()來刪除Delete All MenuItem 。
這是與此答案相關的問題: 問題 。
/** * Set a hint for whether this fragment's menu should be visible. This * is useful if you know that a fragment has been placed in your view * hierarchy so that the user can not currently seen it, so any menu items * it has should also not be shown. * * @param menuVisible The default is true, meaning the fragment's menu will * be shown as usual. If false, the user will not see the menu. */ public void setMenuVisibility(boolean menuVisible) { if (mMenuVisible != menuVisible) { mMenuVisible = menuVisible; if (mHasMenu && isAdded() && !isHidden()) { mHost.onSupportInvalidateOptionsMenu(); } } }
XML菜單示例:
示例片段中的代碼:
private boolean isMenuItemChecked; @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setMenuVisibility(false); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.my_menu, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); try { menu.findItem(R.id.action_check).setVisible(!isMenuItemChecked); menu.findItem(R.id.action_uncheck).setVisible(isMenuItemChecked); } catch(Exception e) { Log.e(TAG, "onPrepareOptionsMenu error"); } } public void loadUi(boolean isMenuItemChecked) { this.isMenuItemChecked = isMenuItemChecked; setMenuVisibility(true); }
對我有用的最佳方式如下所示
將菜單的初始狀態放在onCreateOptionsMenu(…)中
使用invalidateOptionsMenu()強制onCreateOptionsMenu(…)和onPrepareOptionsMenu(…)
在onPrepareOptionsMenu(…)中,調用menu.clear()從菜單中刪除所有項目。
仍然在onPrepareOptionsMenu(…)中將動態菜單更改為清除后
希望這可以幫助…
總結
以上是生活随笔為你收集整理的android使用menu需要重写的方法,Android – 正确使用invalidateOptionsMenu()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux分盘笔记
- 下一篇: Flutter1.12与原生Androi