android: mengubah item menu opsi secara terprogram

89

Apakah mungkin untuk mengubah item menu opsi secara terprogram? Adakah yang bisa memberi saya contoh?

Juga, saya ingin menonaktifkan item tertentu, sehingga mereka tidak mendengarkan klik, mungkinkah?

Farhan
sumber

Jawaban:

212

Untuk siapa pun perlu mengubah opsi menu secara dinamis:

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);
}
Eng.Fouad
sumber
8
Satu peringatan adalah bahwa Anda harus memastikan bahwa menutelah ditetapkan sebelum mencoba untuk MenuItemkeluar darinya. Misalnya, jika Anda memiliki sesuatu seperti actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS), tab dimuat sebelum menu, sehingga memanggil hideOption/ showOptiondalam onTabSelectedmenghasilkan pengecualian penunjuk null.
SaltyNuts
Saat saya menggunakan item.setVisible(false);, item tersebut hanya akan disembunyikan saat saya mengklik Menu itu sendiri. Jika saya menggunakan invalidateOptionsMenu();item tidak menanggapi klik. Saya menghargai jika Anda dapat membantu saya dalam masalah serupa yang saya hadapi. stackoverflow.com/questions/54756799/…
Aliton Oliveira
@AlitonOliveira Anda harus meletakkan bagian item.setVisibility (false) Anda di dalam metode onCreateOptionsMenu dengan memeriksa status variabel flag Anda dan Anda harus mengubah nilai bool flag dan invalidateOptionsMenu. itu akan berhasil.
Kidus Tekeste
Dokumentasi setVisiblemenyatakan bahwa Anda juga harus memanggil setEnabled(false)jika item tersebut masih dapat dipanggil melalui pintasannya
Florian Walther
34

menu.xml

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

masukkan file java Anda

  public void onPrepareOptionsMenu(Menu menu) {

    menu.removeItem(R.id.item1);
}
Imdad Sarkar
sumber
Ini yang saya cari karena saya ingin membuat keputusan satu kali saat runtime tetapi tidak perlu mengubah opsi setelahnya. Saya menggunakan: @Override public boolean onPrepareOptionsMenu (Menu menu) {if (! ShowItemName) {menu.removeItem (R.id.itemname); } kembali benar; }
notmystyle
7

Jika saya harus mengubah konten menu opsi saya, saya melakukannya selama onMenuOpened (). Hal ini memungkinkan saya untuk memeriksa status berjalan pada saat pengguna mengakses menu.

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;
    }
Ashterothi
sumber
Beberapa kata komentar. onMenuOpened dipanggil dua kali. Variasi menu pertama adalah null, sedangkan menu var kedua disiapkan untuk digunakan. Saya selalu menggunakan klausa 'if' untuk memeriksa apakah menu var tidak null.
Ksiądz Pistolet
7

Untuk menonaktifkan item tertentu:

MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML);
item.setEnabled(false);
Marcin S.
sumber
Saat saya mengatur item.setVisible(false); , item saya hanya disembunyikan ketika saya mengklik Menu itu sendiri (tiga titik). Jika saya menggunakan invalidateOptionsMenu();beberapa item tidak menanggapi klik. Saya menghargai jika Anda dapat membantu saya dalam masalah serupa yang saya hadapi. stackoverflow.com/questions/54756799/…
Aliton Oliveira
4

menggunakan baris berikut yang telah saya lakukan untuk menambahkan nilai dalam menu

getActivity().invalidateOptionsMenu();

coba pekerjaan ini seperti pesona bagi saya.

S HemaNandhini
sumber
3

Coba kode ini:

@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();
}
Skywalker
sumber
Saat saya menggunakan invalidateOptionsMenu();, item saya yang selalu terlihat berhenti berfungsi (maksud saya item tidak merespons untuk diklik). Saya menghargai jika Anda dapat membantu saya dalam masalah serupa yang saya hadapi. stackoverflow.com/questions/54756799/…
Aliton Oliveira
2

Anda dapat melakukan sesuatu yang sederhana seperti yang saya lakukan. Ubah saja teks menjadi apa yang diperlukan saat item menu disentuh. Saya perlu mematikan dan menghidupkan suara, ditambah kemampuan untuk melakukan tindakan dengan menyentuhnya. Ini kode saya:

    @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 dan touchOn adalah boolean yang diperiksa di bagian lain kode. Semoga ini membantu.

bob
sumber
Bagaimana saya bisa melakukan ini secara dinamis. Maksud saya ... memanggil layanan web untuk memilih item opsi dan kemudian pada respons yang berhasil ... memanggil ulang onCreateOptionsMenu. Bagaimana melakukannya?
Narendra Singh
1

Anda dapat menyelesaikan tugas Anda hanya dengan menerapkan seperti di bawah ini:

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);
    }
}
Chiranjhivi Ghimire
sumber
1

Jika Anda memiliki 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);
}

Kemudian Anda hanya perlu menelepon:

@Override
public void onBottomBarClick(int tabId) {
    supportInvalidateOptionsMenu();
}
Lucas Montano
sumber
1

Kode Kotlin untuk mengakses toolbar OptionsMenu item secara terprogram & mengubah teks / ikon, ..:

1-Kami memiliki item menu kami di file item menu seperti: menu.xml, kode contoh untuk ini:

 <?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- Tentukan variabel untuk mengakses objek menu di kelas:

var menu: Menu? = null

3- Inisialisasi di 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- Akses item menu di dalam kode atau kesenangan Anda:

private fun initialBalanceMenuItemOnToolbar() {
var menuItemBalance = menu?.findItem(R.id.balance)
    menuItemBalance?.title = Balance?.toString() ?: 0.toString()
    // for change icon : menuWalletBalance?.icon
}
Hamed Jaliliani
sumber
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;
    }
Stefan Cizmar
sumber