60

Activityありますが、動的にActionBarアイコンを変更する必要があります。一時停止ボタンと再生ボタンがあり、ユーザーがクリックすると再生ボタンを一時停止ボタンに置​​き換える必要があります。私は検索して見つけました:ActionBar

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if(DEBUG) Log.i("onCreateOptionsMenu()", "onCreateOptionsMenu() -> LogicAnalizerView");
    //menu.add("").setIcon(R.drawable.pause).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.actionbarlogic, menu);
    menu.removeItem(R.id.pauseLogic);

    return true;
}

このようにして一時停止ボタンを削除し、追加することもできますが、これは を開始しActivityActionBarが描画されたときにのみ発生します。を強制的に再描画するにはどうすればよいActionBarですか? また、このように全体ActionBarを描き直しています。そうですか?必要なボタン/アイコンのみを再描画する方法はありますか?

ありがとうございました :)

4

6 に答える 6

53

インフレーションを行った後、MenuItem への参照を保存する必要があります。したがって、次のようなものです。

public boolean onCreateOptionsMenu( Menu menu ) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate( R.menu.actionbarlogic, menu );
    playMenu = menu.findItem(R.id.playMenu);
    updatePlayStatus();
    return menu;
}

public void updatePlayStatus() {
    if( playService.isConnected() ) {
        playService.isPlaying() ? playMenu.setIcon(R.drawable.pause) : playMenu.setIcon(R.drawable.play);
    }
}

これで、いつでも playMenu を参照できます。したがって、プレーヤーが再生を終了し、再生アイコンに戻る必要があると言うように、アイテムを変更できます。

于 2012-06-13T00:55:38.690 に答える
11
private Menu mMenu;

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main_activity, menu);

    // Save the menu reference
    mMenu = menu;
    return super.onCreateOptionsMenu(menu);
}

// For example - Call when you need to change icon
private void setActionIcon(boolean showWithBadge)
{
    MenuItem item = mMenu.findItem(R.id.ITEM_ID);

    if(mMenu != null)
    {
        if(showWithBadge)
        {
            item.setIcon(R.drawable.IC_WITH_BADGE);           
        }
        else 
        {
            item.setIcon(R.drawable.IC_WITHOUT_BADGE);
        }
    }
}
于 2015-02-12T13:33:52.777 に答える
2

アクティビティ クラスで をオーバーライドするonPrepareOptionsMenuと、メニュー項目を追加/削除したり、表示/非表示にしたりできます。

于 2015-03-04T05:44:00.987 に答える
2

invalidateOptionsMenu() メソッドを使用します。

private boolean isPlaying;

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.actionbarlogic, menu);
    if (isPlaying) menu.removeItem(R.id.play_button);
    else menu.removeItem(R.id.pause_button);
    return true;
}

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.play_button:
            // Do what the play button should do here
            isPlaying = true;
            break;

        case R.id.pause_button:
            // Do what the pause button should do here
            isPlaying = false;
            break;
    }
    invalidateOptionsMenu();
    return true;
}
于 2018-04-20T17:50:59.800 に答える