Подтвердить что ты не робот

Изменение значков в ActionBar динамически

У меня есть 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;
}

Таким образом, я удаляю кнопку "Пауза", и я тоже могу ее добавить, но это происходит только при запуске Activity и ActionBar. Как я могу заставить перерисовать ActionBar? Кроме того, на этом пути все ActionBar перерисовывается. Это правильно? Есть ли способ перерисовать только кнопку/значок, который я хочу?

Спасибо:)

4b9b3361

Ответ 1

Вам нужно будет сэкономить ссылку на 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 в любое время. Таким образом, вы можете изменить элемент, как говорят, что ваш игрок заканчивает игру и должен вернуться к значку воспроизведения.

Ответ 2

Вместо их удаления вы можете просто скрыть кнопку, которую вы не хотите отображать.

Например:

private boolean isPlaying;
MenuItem mPlayMenuItem;
MenuItem mPauseMenuItem;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.actionbarlogic, menu);

    mPlayMenuItem = menu.findItem(R.id.action_play);
    mPauseMenuItem = menu.findItem(R.id.action_pause);

    return super.onCreateOptionsMenu(menu);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case R.id.action_play:
            isPlaying = true;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                this.invalidateOptionsMenu();
            }
            return true;
        case R.id.action_pause:
            isPlaying = false;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                this.invalidateOptionsMenu();
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}


 @Override
public boolean onPrepareOptionsMenu (Menu menu) {
    super.onPrepareOptionsMenu(menu);

    if (isPlaying) {
        mPlayMenuItem.setVisible(false); // hide play button
        mPauseMenuItem.setVisible(true); // show the pause button
    } else if (!isPlaying) {
        mPlayMenuItem.setVisible(true); // show play button
        mPauseMenuItem.setVisible(false); // hide the pause button
    }

    return true;
}

Просто примечание:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
     this.invalidateOptionsMenu();
}

требуется обновить панель действий. После 3.0 устройств панель действий автоматически не обновляется. Итак, вам нужно вручную сообщить ему, чтобы он вызвал "OnPrepareOptionsMenu (Меню)", чтобы он обновил элементы, вызвав "Activity.invalidateOptionsMenu()".

Надеюсь, это поможет!

Ссылка: http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu(android.view.Menu)

http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#invalidateOptionsMenu(android.app.Activity)

Ответ 3

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);
        }
    }
}

Ответ 4

Если вы хотите получить первый пункт из своего меню, **

use menu.getItem(0);

этот код отлично выглядит:

 @Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.my_menu, menu);
       MenuItem m =  menu.getItem(0);
       m.setIcon(R.drawable.your_icon_here);
    }


    return true;
}

Ответ 5

Переопределите onPrepareOptionsMenu в своем классе активности, а затем вы можете добавлять/удалять или видимые/невидимые пункты меню.