簡體   English   中英

如何更新ActionBar中顯示的菜單項?

[英]How to update a menu item shown in the ActionBar?

我有一個活動,有2個片段。 兩者都是ListFragments,並且都將MenuItems貢獻給菜單。 我有一個MenuItem我設置了屬性android:showAsAction讓它顯示為ActionBar上的一個按鈕。 哪個工作正常。

現在MenuItem依賴於狀態。 它是暫停/恢復菜單選項,用於暫停和恢復隊列。 我的問題是,當創建片段時,我無法弄清楚如何設置它的初始雕像。

它的狀態取決於隊列是否暫停。 所以我有一個AsyncTask來獲取隊列並根據隊列的狀態設置一個布爾值(暫停)。 我正在調用PrepareOptionsMenu來根據隊列的最后已知狀態設置Pause菜單項的文本,如果我將MenuItem保留在實際菜單中,這將很有用。 您點擊菜單圖標並觸發onPrepareOptionsMenu,菜單會在顯示之前更新。

問題是,如果我在ActionBar(showAsAction)上放置相同的MenuItem,如何強制它更新而不必調用onPrepareOptionsMenu? 我需要能夠這樣做,因為在第一次啟動應用程序時,我發送了一個獲取隊列的請求,但是在設置並顯示ActionBar后,任務返回。 我在我的片段中創建了一個處理程序,每次我獲得隊列更新時都會調用它,但是從那里,如何在ActionBar上更新我的MenuItem的文本? 我似乎無法找到一種方法來獲取當前設置的Menu來操作它,除了onPrepareOptionMenu。

羅布

選項#1:嘗試invalidateOptionsMenu() 我不知道這是否會強制立即重新繪制操作欄。

選項#2:查看getActionView()返回受影響的MenuItem任何內容。 showAsAction可能只是自動為您創建操作視圖。 如果是這樣,您可以啟用/禁用該View

我似乎無法找到一種方法來獲取當前設置的Menu來操作它,除了onPrepareOptionMenu。

您可以掛在您傳遞給onCreateOptionsMenu()Menu對象上。 引用文檔

您可以安全地按住菜單(以及從中創建的任何項目),根據需要對其進行修改,直到下次調用onCreateOptionsMenu()為止。

在我的情況下: invalidateOptionsMenu只是將文本重新設置為原始文本,但直接訪問菜單項並重新編寫所需的文本工作沒有問題:

if (mnuTopMenuActionBar_ != null) {
    MenuItem mnuPageIndex = mnuTopMenuActionBar_
        .findItem(R.id.menu_magazin_pageOfPage_text);

    if (mnuPageIndex != null) {
        if (getScreenOrientation() == 1) {
            mnuPageIndex.setTitle((i + 1) + " von " + pages);
        }
        else {
            mnuPageIndex.setTitle(
                (i + 1) + " + " + (i + 2) + " " + " von " + pages);
        }
        // invalidateOptionsMenu();
    }
}

由於下面的評論,我能夠通過以下代碼訪問菜單項:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.magazine_swipe_activity, menu);
    mnuTopMenuActionBar_ = menu;
    return true;
}

要從Fragment刷新菜單,只需調用:

getActivity().invalidateOptionsMenu();

我用過這段代碼:

public boolean onPrepareOptionsMenu (Menu menu) {       
    MenuInflater inflater = getMenuInflater();
    TextView title  = (TextView) findViewById(R.id.title);
    menu.getItem(0).setTitle(
        getString(R.string.payFor) + " " + title.getText().toString());
    menu.getItem(1).setTitle(getString(R.string.payFor) + "...");
    return true;        
}

對我來說就像一個魅力,你可以在這里找到OnPrepareOptionsMenu

首先,請按照兩行代碼更新操作欄項,然后才能在oncreateOptionMenu()中設置條件。 例如:

Boolean mISQuizItemSelected = false;

/**
 * Called to inflate the action bar menus
 *
 * @param menu
 *      the menu
 *
 * @return true, if successful
 */

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu items for use in the action bar

    inflater.inflate(R.menu.menu_demo, menu);

    //condition to hide the menus
    if (mISQuizItemSelected) {
        for (int i = 0; i < menu.size(); i++) {
            menu.getItem(i).setVisible(false);
        }
    }

    return super.onCreateOptionsMenu(menu);
}

/**
 * Called when the item on the action bar being selected.
 *
 * @param item
 *      menuitem being selected
 *
 * @return true if the menuitem id being selected is matched
 * false if none of the menuitems id are matched
 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getId() == R.id.action_quiz) {
        //to navigate based on the usertype either learner or leo
        mISQuizItemSelected = true;

        ActionBar actionBar = getActionBar();
        invalidateOptionMenu();
    }
}

為了清楚起見,我認為可以從下面顯示抓取資源的直接示例,我認為通過快速直接示例有助於對此問題的響應。

private MenuItem menuItem_;

@Override
public boolean onCreateOptionsMenu(Menu menuF) 
{
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_layout, menuF);
    menuItem_ = menuF.findItem(R.id.menu_item_identifier);
    return true;
}

在這種情況下,您在開頭處按住MenuItem引用,然后在稍后的給定時間點更改它的狀態(例如,對於圖標狀態更改)。

Kotlin 1.2中,只需致電:

invalidateOptionsMenu()

並將再次調用onCreateOptionsMenu函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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