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?
Jawaban:
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);
}
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/…
setVisible
menyatakan bahwa Anda juga harus memanggil setEnabled(false)
jika item tersebut masih dapat dipanggil melalui pintasannya
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);
}
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?
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;
}
Untuk menonaktifkan item tertentu:
MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML);
item.setEnabled(false);
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/…
menggunakan baris berikut yang telah saya lakukan untuk menambahkan nilai dalam menu
getActivity().invalidateOptionsMenu();
coba pekerjaan ini seperti pesona bagi saya.
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();
}
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.
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);
}
}
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();
}
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
}
@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;
}
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.