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)"를 수동으로 지시해야합니다.
도움이 되셨기를 바랍니다!
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
'ProgramingTip' 카테고리의 다른 글
접두사를 CTRL + A로 다시 매핑 한 후 tmux에서 줄 시작으로 이동하는 방법은 무엇입니까? (0) | 2021.01.07 |
---|---|
TypeError : 문자 버퍼 개체가 필요합니다-정수를 텍스트 파일에 저장하는 동안 (0) | 2021.01.07 |
내부 .NET Framework 데이터 공급자 오류 1025 (0) | 2021.01.07 |
unittest setUp으로 mock을 사용하는 방법 (0) | 2021.01.07 |
다른 지점에서 tree-ish를`git log`하는 방법은 무엇입니까? (0) | 2021.01.07 |