簡體   English   中英

為什么onCreateOptionsMenu會多次運行?

[英]Why does onCreateOptionsMenu run multiple times?

出於某種原因,我的onCreateOptionsMenuonPrepareOptionsMenu運行兩次(在兩個方法的開頭都使用日志輸入進行檢查)。 這種情況發生在我擁有的多個片段中,包括一些非常基本的片段(只是給菜單充氣,沒有別的)。

這是具有此問題的onCreateOptionsMenu之一:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.actionbuttons_add_removeall, menu);
    optionsMenu = menu;
}

什么可能導致這些方法被多次調用(大多數兩次)?


更新

我發現這是由我正在使用的RecyclerView引起的(以某種方式)。 所有有這個問題的觀點都使用了RV,我之前提到過的觀點沒有這個問題,實際上並沒有。 有了這個新信息,RV的哪一部分可能會出現這個問題?

UPDATE2

我發現我在AdaptergetItemCount()方法中調用.invalidateOptionsMenu() 認為這會調用onPrepareOptionsMenu() ,但是閱讀文檔,似乎它調用onCreateOptionsMenu() 我可能會onPrepare..() onCreate..()onPrepare..()在這里反轉,現在就檢查一下。

UPDATE3

我剛剛意識到我在我的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;
        }
    }
}

這是我自己的錯。 我在我的RecyclerViewAdaptergetItemCount()方法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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM