日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android使用menu需要重写的方法,Android – 正确使用invalidateOptionsMenu()

發布時間:2023/12/10 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。