ProgramingTip

ActionBar의 아이콘을 동적으로 변경

bestdevel 2021. 1. 7. 21:27
반응형

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가 다시 그려집니다. 맞습니까? 원하는 버튼 / 아이콘 만 다시 그리는 방법이 있습니까?

감사합니다 :)


인플레이션을 수행 한 후 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);
    }
}

할 수 있습니다. 따라서 재생 아이콘으로 재생을 마치고 재생 아이콘으로 돌아갈 수 있습니다.


대신 사용하는 대신 표시하지 않습니다.

예를 들면 :

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 장치 이후에는 작업 표시 줄이 자동으로 업데이트되지 않습니다. 따라서 "Activity.invalidateOptionsMenu ()"를 호출하여 항목을 새로 고치도록 "OnPrepareOptionsMenu (Menu)"를 수동으로 지시해야합니다.

도움이 되셨기를 바랍니다!

참조 : 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)


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

onPrepareOptionsMenu활동 클래스에서를 재정의 한 다음 메뉴 항목을 추가 / 제거하거나 표시 / 보이지 않을 수 있습니다.


메뉴에서 첫 번째 항목을 얻으려면 **

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

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

참조 URL : https://stackoverflow.com/questions/11006749/change-icons-in-actionbar-dynamically

반응형