![](/img/trans.png)
[英]Why does the Android onCreateOptionsMenu method return super.onCreateOptionsMenu?
[英]Why does onCreateOptionsMenu run multiple times?
出於某種原因,我的onCreateOptionsMenu
和onPrepareOptionsMenu
運行兩次(在兩個方法的開頭都使用日志輸入進行檢查)。 這種情況發生在我擁有的多個片段中,包括一些非常基本的片段(只是給菜單充氣,沒有別的)。
這是具有此問題的onCreateOptionsMenu
之一:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.actionbuttons_add_removeall, menu);
optionsMenu = menu;
}
什么可能導致這些方法被多次調用(大多數兩次)?
我發現這是由我正在使用的RecyclerView
引起的(以某種方式)。 所有有這個問題的觀點都使用了RV,我之前提到過的觀點沒有這個問題,實際上並沒有。 有了這個新信息,RV的哪一部分可能會出現這個問題?
我發現我在Adapter
的getItemCount()
方法中調用.invalidateOptionsMenu()
。 我認為這會調用onPrepareOptionsMenu()
,但是閱讀文檔,似乎它調用onCreateOptionsMenu()
。 我可能會onPrepare..()
onCreate..()
和onPrepare..()
在這里反轉,現在就檢查一下。
我剛剛意識到我在我的RecyclerViewAdapter
的選項菜單無效,在getItemCount()
方法中,這顯然在首次創建片段時運行。
@Override
public int getItemCount() {
int tableSize = getTableSizeMethod();
if (tableSize < 1) {
if (!AppManagerFragment.hideDeleteAllButton) {
AppManagerFragment.hideDeleteAllButton = true;
((Activity) context).invalidateOptionsMenu();
return 0;
}
} else {
if (!AppManagerFragment.hideDeleteAllButton) {
AppManagerFragment.hideDeleteAllButton = false;
((Activity) context).invalidateOptionsMenu();
return tableSize;
}
}
}
這是我自己的錯。 我在我的RecyclerViewAdapter
的getItemCount()
方法getItemCount()
選項菜單無效,這顯然在啟動片段時運行。 您可以查看包含我的錯誤的代碼的問題。 感謝所有的幫助/建議。
只要片段首先創建或變為可見,就會調用這些方法和onResume,因為onCreate甚至在onCreateView之前被調用,其中所有非ui事物都被初始化並且調用了Activity。 希望很清楚為什么這兩個人多次調用Parent Activity的super()。
現在該做什么來阻止片段從調用活動的onCreateOptionsMenu再次再次膨脹菜單布局,在片段內部的onCreate(重寫方法)內聲明。
setHasOptionsMenu(false);
如果你想在活動中有菜單,但是片段的菜單也不同
menu.clear();
而不是從片段的onCreateOptionsMenu()
調用super()
onCreateOptionsMenu()
如果您只想在Mainactivity中禁用菜單,請嘗試return false
或從MainActivity中刪除onCreateOptionsMenu()
。
正如您所說,啟動器活動是一個片段,因此您要禁用此片段的菜單,因此請在此片段中執行以下操作:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
然后從onCreateOptionsMenu()
里面的同一個片段中禁用並隱藏那些menuItem。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
}
即使這沒有幫助,然后嘗試查找單獨的菜單項並禁用它們並將其可見性設置為false。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (menu != null) {
menu.findItem(R.id.action_abc).setVisible(false);
menu.findItem(R.id.action_xyz).setVisible(false);
}
}
希望我幫忙。 !
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.