android: seçenek menüsü öğelerini programlı olarak değiştirme


89

Seçenek menü öğelerini programlı olarak değiştirmek mümkün mü? Biri bana bir örnek verebilir mi lütfen?

Ayrıca, tıklamaları dinlememeleri için belirli öğeleri devre dışı bırakmak istiyorum, bu mümkün mü?

Yanıtlar:


212

Herkesin menü seçeneklerini dinamik olarak değiştirmesi gerekir:

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
Bir uyarı, ondan menuçıkmaya çalışmadan önce ayarlandığından emin olmanız gerektiğidir MenuItem. Örneğin, buna benzer bir şeyiniz varsa actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS), sekmeler menüden önce yüklenir, bu nedenle hideOption/ showOptioniçinde çağrılması onTabSelectedboş bir işaretçi istisnasıyla sonuçlanır.
SaltyNuts

item.setVisible(false);Öğeyi kullandığımda , yalnızca Menüye tıkladığımda gizleniyor. Ben kullanırsanız invalidateOptionsMenu();yanıt vermeyen öğeyi tıklayın. Karşılaştığım benzer bir konuda bana yardımcı olabilirseniz minnettarım. stackoverflow.com/questions/54756799/…
Aliton Oliveira

@AlitonOliveira, flag değişken durumunuzu kontrol ederek item.setVisibility (false) bölümünü onCreateOptionsMenu metodunun içine koymalı ve flaginizin bool değerini değiştirmeli ve invalidateOptionsMenu yapmalısınız. Çalışacak.
Kidus Tekeste

setVisibleAyrıca aramanız gereken durumların dokümantasyonu setEnabled(false), öğe kısayol aracılığıyla hala çağrılabilir
Florian Walther

34

menu.xml

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

java dosyanızı koyun

  public void onPrepareOptionsMenu(Menu menu) {

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

Bu aradığım şeydi çünkü kararı çalışma zamanında bir kez vermek istiyorum, ancak daha sonra seçenekleri değiştirmeme gerek yok. Ben kullandım: @Override public boolean onPrepareOptionsMenu (Menu menu) {if (! ShowItemName) {menu.removeItem (R.id.itemname); } true döndürür; }
notmystyle


7

Seçenekler menüsünün içeriğini değiştirmem gerekirse, bunu onMenuOpened () sırasında gerçekleştiriyorum. Bu, kullanıcının menüye eriştiği anda çalışma durumunu kontrol etmeme izin veriyor.

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

Birkaç kelime yorum. onMenuOpened iki kez çağrılır. İlk seferde menü değişkeni boş, ikinci seferde menü değişkeni kullanılmak üzere hazırlandı. Menü var null olup olmadığını kontrol etmek için her zaman 'if' cümlesi kullanırım.
Ksiądz Pistolet

7

Belirli öğeleri devre dışı bırakmak için:

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

Ayarladığımda item.setVisible(false);, öğem yalnızca Menünün kendisine (üç nokta) tıkladığımda gizleniyor. Ben kullanırsanız invalidateOptionsMenu();bazı öğeleri tıkla tepki vermezler. Karşılaştığım benzer bir konuda bana yardımcı olabilirseniz minnettarım. stackoverflow.com/questions/54756799/…
Aliton Oliveira

4

aşağıdaki satırları kullanarak menüdeki değerleri eklemek için yaptım

getActivity().invalidateOptionsMenu();

bu işi benim için bir cazibe gibi dene.


3

Bu kodu deneyin:

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

Kullandığımda invalidateOptionsMenu();, her zaman görünen öğelerim çalışmayı durduruyor (yani öğeler tıklamaya yanıt vermiyor). Karşılaştığım benzer bir konuda bana yardımcı olabilirseniz minnettarım. stackoverflow.com/questions/54756799/…
Aliton Oliveira

2

Benim yaptığım gibi basit bir şey yapabilirsiniz. Metni, menü öğesine dokunulduğunda gerekene değiştirin. Sesi açıp kapatmam ve ayrıca dokunarak bir eylem gerçekleştirebilmem gerekiyordu. İşte kodum:

    @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 ve touchOn, kodun diğer bölümlerinde kontrol edilen boole'lerdir. Bu yardımcı olur umarım.


Bunu dinamik olarak nasıl yapabilirim? Demek istediğim ... bir seçenek öğesini seçtikten sonra bir web servisini çağırmak ve ardından başarılı yanıtını ... onCreateOptionsMenu'yu yeniden çağırmak. Nasıl yapmalı?
Narendra Singh

1

aşağıdaki gibi uygulayarak görevinizi kolayca gerçekleştirebilirsiniz:

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'ınız olması durumunda:

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

O zaman aramanız yeterli:

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

1

Araç çubuğuna erişim için Kotlin Kodu SeçeneklerMenu öğeleri programlı olarak & metni / simgeyi değiştir, ..:

1-Menü öğeleri dosyasında menü öğemiz var: menu.xml, bunun için örnek kod:

 <?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- Sınıfta menü nesnesine erişmek için bir değişken tanımlayın:

var menu: Menu? = null

3- onCreateOptionsMenu'da başlatın:

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- Kodunuzun veya eğlencenizin içindeki menü öğelerine erişin:

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;
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.