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?
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);
}
menu
telah ditetapkan sebelum mencoba untukMenuItem
keluar darinya. Misalnya, jika Anda memiliki sesuatu sepertiactionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)
, tab dimuat sebelum menu, sehingga memanggilhideOption
/showOption
dalamonTabSelected
menghasilkan pengecualian penunjuk null.item.setVisible(false);
, item tersebut hanya akan disembunyikan saat saya mengklik Menu itu sendiri. Jika saya menggunakaninvalidateOptionsMenu();
item tidak menanggapi klik. Saya menghargai jika Anda dapat membantu saya dalam masalah serupa yang saya hadapi. stackoverflow.com/questions/54756799/…setVisible
menyatakan bahwa Anda juga harus memanggilsetEnabled(false)
jika item tersebut masih dapat dipanggil melalui pintasannyamenu.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); }
sumber
Seperti yang Nikolay katakan lakukan itu di onPrepareOptionsMenu ().
Untuk item menu di action bar Anda harus membuat menu menjadi tidak valid
activity.invalidateOptionsMenu();
Ini dijelaskan lebih detail di sini Bagaimana cara menyegarkan ActionBar saat onPrepareOptionsMenu beralih entri menu?
sumber
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; }
sumber
Untuk menonaktifkan item tertentu:
MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML); item.setEnabled(false);
sumber
item.setVisible(false);
, item saya hanya disembunyikan ketika saya mengklik Menu itu sendiri (tiga titik). Jika saya menggunakaninvalidateOptionsMenu();
beberapa item tidak menanggapi klik. Saya menghargai jika Anda dapat membantu saya dalam masalah serupa yang saya hadapi. stackoverflow.com/questions/54756799/…menggunakan baris berikut yang telah saya lakukan untuk menambahkan nilai dalam menu
coba pekerjaan ini seperti pesona bagi saya.
sumber
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(); }
sumber
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/…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.
sumber
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); } }
sumber
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(); }
sumber
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 }
sumber
@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; }
sumber