96

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

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

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

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

ロブ W.

4

7 に答える 7

177

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

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

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

Menu渡されたオブジェにぶら下がることができますonCreateOptionsMenu()ドキュメントの引用:

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

于 2011-04-23T23:37:28.157 に答える
14

私の場合: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;
}
于 2011-12-05T13:42:34.887 に答える
12

Fragment からメニューを更新するには、次のように呼び出します。

getActivity().invalidateOptionsMenu();
于 2016-08-23T11:08:07.693 に答える
4

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

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

于 2012-07-10T09:18:07.710 に答える
2

まず、oncreateOptionMenu() で条件を設定する前に、2 行のコードに従ってアクション バーの項目を更新してください。例えば:

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();
    }
}
于 2014-09-08T17:48:20.760 に答える
1

明確にするために、リソースをつかむ直接的な例を以下から示すことができると思いました。これは、この質問への回答に貢献すると思われます。

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

于 2014-07-24T20:10:51.907 に答える