Android : 프로그래밍 방식으로 옵션 메뉴 항목 변경


89

프로그래밍 방식으로 옵션 메뉴 항목을 변경할 수 있습니까? 누구든지 예를 들어 줄 수 있습니까?

또한 클릭을 듣지 않도록 특정 항목을 비활성화하고 싶습니다. 가능합니까?

답변:


212

누구나 메뉴의 옵션을 동적으로 변경해야하는 경우 :

private Menu menu;

// ...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    this.menu = menu;
    getMenuInflater().inflate(R.menu.options, menu);
    return true;
}

// ...

private void hideOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(false);
}

private void showOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(true);
}

private void setOptionTitle(int id, String title)
{
    MenuItem item = menu.findItem(id);
    item.setTitle(title);
}

private void setOptionIcon(int id, int iconRes)
{
    MenuItem item = menu.findItem(id);
    item.setIcon(iconRes);
}

8
한 가지주의 menuMenuItem점은 그것을 벗어나 려고 시도하기 전에 설정되어 있는지 확인해야한다는 것입니다. 예를 들어,와 같은 것이있는 경우 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)탭이 메뉴 전에로드되므로 hideOption/ showOptionwithin를 호출 onTabSelected하면 null 포인터 예외가 발생합니다.
SaltyNuts 2013 년

를 사용 item.setVisible(false);하면 메뉴 자체를 클릭 할 때만 항목이 숨겨집니다. invalidateOptionsMenu();항목을 사용 하면 클릭에 응답하지 않습니다. 제가 직면 한 비슷한 문제에 대해 저를 도울 수 있다면 감사합니다. stackoverflow.com/questions/54756799/…
Aliton Oliveira

@AlitonOliveira 플래그 변수 상태를 확인하여 onCreateOptionsMenu 메서드에 item.setVisibility (false) 부분을 넣어야하며 플래그 및 invalidateOptionsMenu의 bool 값을 변경해야합니다. 작동합니다.
Kidus Tekeste 19

그렇지 않으면 항목을 setVisible호출해야하는 상태에 대한 문서는 setEnabled(false)바로 가기를 통해 항목을 계속 호출 할 수 있습니다.
Florian Walther

34

menu.xml

  <item 
    android:id="@+id/item1"
    android:title="your Item">
  </item>

자바 파일에 넣어

  public void onPrepareOptionsMenu(Menu menu) {

    menu.removeItem(R.id.item1);
}

이것은 런타임에 한 번 결정을 내리고 싶지만 나중에 옵션을 변경할 필요가 없기 때문에 내가 찾고 있던 것입니다. 나는 사용했다 : @Override public boolean onPrepareOptionsMenu (Menu menu) {if (! showItemName) {menu.removeItem (R.id.itemname); } return true; }
notmystyle


7

옵션 메뉴의 내용을 변경해야하는 경우 onMenuOpened () 중에 수행합니다. 이를 통해 사용자가 메뉴에 액세스하는 순간의 실행 상태를 확인할 수 있습니다.

public boolean onMenuOpened(int featureid, Menu menu)
    {
        menu.clear();
        if (!editable)
        {
            MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign));
            MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify));
            MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete));
            itemAdd.setShortcut('0', 'a');
            itemMod.setShortcut('1', 'm');
            itemDel.setShortcut('2', 'd');
        }
        else
        {
            MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges));
            itemSave.setShortcut('0', 'S');
        }


        return true;
    }

몇 마디의 의견. onMenuOpened는 두 번 호출됩니다. 첫 번째 메뉴 var는 null이고 두 번째 메뉴 var는 사용할 준비가됩니다. 나는 항상 'if'절을 사용하여 메뉴 변수가 null이 아닌지 확인합니다.
Ksiądz Pistolet

7

특정 항목을 비활성화하려면 :

MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML);
item.setEnabled(false);

을 설정 item.setVisible(false);하면 메뉴 자체 (점 3 개)를 클릭 할 때만 항목이 숨겨집니다. invalidateOptionsMenu();일부 항목을 사용 하면 클릭에 응답하지 않습니다. 제가 직면 한 비슷한 문제에 대해 저를 도울 수 있다면 감사합니다. stackoverflow.com/questions/54756799/…
Aliton Oliveira

4

다음 줄을 사용하여 메뉴에 값을 추가했습니다.

getActivity().invalidateOptionsMenu();

나에게 매력처럼이 작업을 시도해보세요.


3

이 코드를 시도하십시오.

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    this.menu=menu;
    updateMenuItems(menu);
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.document_list_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    if (item.getItemId() == android.R.id.home) {
        onHomeButtonPresssed();
    }else if (item.getItemId() == R.id.action_delete) {
        useCheckBoxAdapter=false;
        deleteDocuments();
    } else if (item.getItemId() == R.id.share) {
        useCheckBoxAdapter=false;
        shareDocuments();
    } else if (item.getItemId() == R.id.action_tick) {
        useCheckBoxAdapter=true;
        onShowCheckboxes();
    }
    updateMenuItems(menu);
    return true;
}

private void updateMenuItems(Menu menu){
    if (useCheckBoxAdapter && menu != null) {
        menu.findItem(R.id.action_delete).setVisible(true);
        menu.findItem(R.id.share).setVisible(true);
        menu.findItem(R.id.action_tick).setVisible(false);
    } else {
        menu.findItem(R.id.action_delete).setVisible(false);
        menu.findItem(R.id.share).setVisible(false);
        menu.findItem(R.id.action_tick).setVisible(true);
    }
    invalidateOptionsMenu();
}

을 사용하면 invalidateOptionsMenu();항상 표시되는 항목이 작동하지 않습니다 (항목이 클릭에 응답하지 않음을 의미 함). 제가 직면 한 비슷한 문제에 대해 저를 도울 수 있다면 감사합니다. stackoverflow.com/questions/54756799/...
Aliton 올리베이라에게

2

나처럼 간단한 일을 할 수 있습니다. 메뉴 항목을 터치 할 때 필요한 텍스트로 변경하기 만하면됩니다. 나는 소리를 끄고 켜야했고, 터치하여 동작을 수행 할 수있는 능력이 필요했습니다. 내 코드는 다음과 같습니다.

    @Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
    case R.id.audioOn:
        audioOn = !audioOn;
        if (audioOn)
            item.setTitle("Audio Off");
        else
            item.setTitle("Audio On");
        return true;

    case R.id.touchOn:
        touchOn = !touchOn;
        if (touchOn)
            item.setTitle("Touch Off");
        else
            item.setTitle("Touch On");
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

audioOn 및 touchOn은 코드의 다른 부분에서 확인 된 부울입니다. 도움이 되었기를 바랍니다.


어떻게 동적으로 할 수 있습니까? 내 말은 ... 옵션 항목을 선택할 때 웹 서비스를 호출 한 다음 성공적인 응답으로 onCreateOptionsMenu를 다시 호출하는 것입니다. 어떻게하나요?
Narendra Singh

1

다음과 같이 구현하기 만하면 작업을 수행 할 수 있습니다.

private Menu menu;

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.drive_menu, menu);
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    this.menu = menu;
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.action_toggle_grid) {
        handleMenuOption(id);
        return true;

    } else if(id == R.id.action_toggle_list){
        handleMenuOption(id);
        return true;
    }

    return super.onOptionsItemSelected(item);
}

private void handleMenuOption(int id) {
    MenuItem item = menu.findItem(id);
    if (id == R.id.action_toggle_grid){
        item.setVisible(false);
        menu.findItem(R.id.action_toggle_list).setVisible(true);
    }else if (id == R.id.action_toggle_list){
        item.setVisible(false);
        menu.findItem(R.id.action_toggle_grid).setVisible(true);
    }
}

1

BottomBar가있는 경우 :

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    if (mBottomBar.getCurrentTabId() == R.id.tab_more) {
        getMenuInflater().inflate(R.menu.more_menu, menu);
    }

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.preferences:
            startActivity(new Intent(this, PreferenceActivity.class));
            break;
    }

    return super.onOptionsItemSelected(item);
}

그런 다음 전화하면됩니다.

@Override
public void onBottomBarClick(int tabId) {
    supportInvalidateOptionsMenu();
}

1

툴바 OptionsMenu 항목에 프로그래밍 방식으로 액세스하고 텍스트 / 아이콘을 변경하기위한 Kotlin 코드 .. :

1- 다음과 같은 메뉴 항목 파일에 메뉴 항목이 있습니다. menu.xml, 이에 대한 샘플 코드 :

 <?xml version="1.0" encoding="utf-8"?> 
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/balance"
      android:title="0"
      android:orderInCategory="100"
      app:showAsAction="always" />
 </menu>

2- 클래스의 메뉴 개체에 액세스하기위한 변수를 정의합니다.

var menu: Menu? = null

3- onCreateOptionsMenu에서 초기화하십시오.

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the menu; this adds items to the action bar if it is present.
    menuInflater.inflate(R.menu.main, menu)
    this.menu = menu
    return true
}

4- 코드 또는 재미 내 메뉴 항목에 액세스하십시오.

private fun initialBalanceMenuItemOnToolbar() {
var menuItemBalance = menu?.findItem(R.id.balance)
    menuItemBalance?.title = Balance?.toString() ?: 0.toString()
    // for change icon : menuWalletBalance?.icon
}

1
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.calendar, menu);
        if(show_list == true) {         

        if(!locale.equalsIgnoreCase("sk")) menu.findItem(R.id.action_cyclesn).setVisible(false);

        return true;
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.