web-dev-qa-db-ja.com

ActionBarに表示されるメニュー項目を更新する方法は?

2つのフラグメントを持つアクティビティがあります。どちらもListFragmentsであり、どちらもMenuItemsをメニューに提供します。 ActionBarのボタンとして表示するようにAndroid:showAsAction属性を設定したMenuItemが1つあります。それはうまくいきます。

これで、MenuItemは状態に依存します。キューを一時停止および再開するための[一時停止/再開]メニューオプションです。私の問題は、フラグメントが作成されたときに最初の像をどのように設定するかわからないことです。

その状態は、キューが一時停止されているかどうかによって異なります。したがって、キューを取得し、キューの状態に基づいてブール値(一時停止)を設定するAsyncTaskがあります。 onPrepareOptionsMenuを呼び出して、キューの最後の既知の状態に基づいて一時停止メニュー項目のテキストを設定します。これは、実際のメニューにMenuItemを残しておくとうまく機能します。メニューアイコンをタップすると、onPrepareOptionsMenuが起動され、メニューが表示される前に更新されます。

問題は、同じMenuItemをActionBar(showAsAction)に配置すると、onPrepareOptionsMenuを呼び出さずに強制的に更新できるようになることです。アプリを最初に起動したときにキューを取得するリクエストを送信しますが、ActionBarがセットアップされて表示された後にタスクが返されるため、これを実行できる必要があります。キューの更新を取得するたびに呼び出されるハンドラーをフラグメントに作成しましたが、そこからActionBarのMenuItemのテキストを更新するにはどうすればよいですか? onPrepareOptionMenuを除いて、現在設定されているメニューを操作する方法を見つけることができないようです。

ロブ・W.

91
brockoli

オプション#1: invalidateOptionsMenu() を試してください。これがアクションバーの即時再描画を強制するかどうかはわかりません。

オプション#2:影響を受けるMenuItemに対してgetActionView()が何かを返すかどうかを確認します。 showAsActionが単にアクションビューを自動的に作成する可能性があります。その場合、おそらくViewを有効/無効にすることができます。

OnPrepareOptionMenuを除いて、現在設定されているメニューを操作する方法を見つけることができないようです。

onCreateOptionsMenu()で渡されたMenuオブジェクトにハングアップできます。 docs の引用:

次回onCreateOptionsMenu()が呼び出されるまで、メニュー(およびメニューから作成された項目)を安全に保持し、必要に応じて変更することができます。

170
CommonsWare

私の場合: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;
}
12
cV2

フラグメントからメニューを更新するには、次を呼び出します。

getActivity().invalidateOptionsMenu();
8
CoolMind

私はこのコードを使用しました:

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 here を見つけることができます

4
ASK

最初に2行のコードに従ってアクションバーの項目を更新してから、oncreateOptionsMenu()で条件を設定してください。例えば:

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();
    }
}
2
saranya

わかりやすくするために、リソースをつかむ直接的な例を次のように示すことができると考えたので、簡単な直接の例でこの質問の回答に貢献すると思います。

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参照を保持し、その後の特定の時点でその状態を変更します(たとえば、アイコンの状態を変更するため)。

1
Jay Snayder