Jawaban:
Bagaimanapun, dokumentasi mencakup semua hal.
Setelah aktivitas dibuat,
onCreateOptionsMenu()
metode ini dipanggil hanya sekali, seperti dijelaskan di atas. Sistem menyimpan dan menggunakan kembali yangMenu
Anda tetapkan dalam metode ini hingga aktivitas Anda dihancurkan. Jika Anda ingin mengubah Menu Opsi kapan saja setelah pertama kali dibuat, Anda harus menggantionPrepareOptionsMenu()
metode. Ini memberi Anda objek Menu seperti yang ada saat ini. Ini berguna jika Anda ingin menghapus, menambah, menonaktifkan, atau mengaktifkan item menu tergantung pada kondisi aplikasi Anda saat ini.
Misalnya
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
if (isFinalized) {
menu.getItem(1).setEnabled(false);
// You can also use something like:
// menu.findItem(R.id.example_foobar).setEnabled(false);
}
return true;
}
Pada Android 3.0 dan lebih tinggi, menu opsi dianggap selalu terbuka ketika item menu disajikan di panel tindakan. Ketika suatu peristiwa terjadi dan Anda ingin melakukan pembaruan menu, Anda harus menelepon invalidateOptionsMenu()
untuk meminta panggilan sistem onPrepareOptionsMenu()
.
false
untuk menonaktifkan menu sepenuhnya.
Pada semua versi Android, cara termudah: gunakan ini untuk MENUNJUKKAN ikon tindakan menu sebagai dinonaktifkan DAN menjadikannya FUNGSI juga dinonaktifkan:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem item = menu.findItem(R.id.menu_my_item);
if (myItemShouldBeEnabled) {
item.setEnabled(true);
item.getIcon().setAlpha(255);
} else {
// disabled
item.setEnabled(false);
item.getIcon().setAlpha(130);
}
}
Anda bisa menyimpan item sebagai variabel saat membuat menu opsi dan kemudian mengubah propertinya sesuka hati.
private MenuItem securedConnection;
private MenuItem insecuredConnection;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.connect_menu, menu);
securedConnection = menu.getItem(0);
insecuredConnection = menu.getItem(1);
return true;
}
public void foo(){
securedConnection.setEnabled(true);
}
onPrepareOptionsMenu
?
menyederhanakan versi @Vikas
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
menu.findItem(R.id.example_foobar).setEnabled(isFinalized);
return true;
}
Cara memperbarui menu saat ini untuk mengaktifkan atau menonaktifkan item ketika AsyncTask dilakukan.
Dalam kasus penggunaan saya, saya perlu menonaktifkan menu saya ketika AsyncTask saya sedang memuat data, kemudian setelah memuat semua data, saya perlu mengaktifkan semua menu lagi agar pengguna dapat menggunakannya.
Ini mencegah aplikasi untuk membiarkan pengguna mengklik item menu saat data sedang dimuat.
Pertama, saya mendeklarasikan variabel status, jika variabelnya adalah 0 maka menu akan ditampilkan, jika variabel itu adalah 1 maka menu akan disembunyikan.
private mMenuState = 1; //I initialize it on 1 since I need all elements to be hidden when my activity starts loading.
Kemudian di saya, onCreateOptionsMenu()
saya memeriksa variabel ini, jika 1 saya menonaktifkan semua item saya, jika tidak, saya hanya menunjukkan semuanya
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_galeria_pictos, menu);
if(mMenuState==1){
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setVisible(false);
}
}else{
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setVisible(true);
}
}
return super.onCreateOptionsMenu(menu);
}
Sekarang, ketika Aktivitas saya dimulai, onCreateOptionsMenu()
akan dipanggil sekali saja, dan semua barang saya akan hilang karena saya mengatur keadaan untuk mereka di awal.
Lalu saya membuat AsyncTask Di mana saya mengatur variabel status ke 0 di saya onPostExecute()
Langkah ini sangat penting!
Ketika Anda memanggilnya invalidateOptionsMenu();
akan diluncurkan kembalionCreateOptionsMenu();
Jadi, setelah mengatur status saya ke 0, saya hanya menggambar ulang semua menu tapi kali ini dengan variabel saya pada 0, yang mengatakan, semua menu akan ditampilkan setelah semua proses asinkron dilakukan, dan kemudian pengguna saya dapat menggunakan menu .
public class LoadMyGroups extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mMenuState = 1; //you can set here the state of the menu too if you dont want to initialize it at global declaration.
}
@Override
protected Void doInBackground(Void... voids) {
//Background work
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
mMenuState=0; //We change the state and relaunch onCreateOptionsMenu
invalidateOptionsMenu(); //Relaunch onCreateOptionsMenu
}
}
solusi terbaik saat Anda tampil di laci navigasi
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.setGroupVisible(0,false);
return true;
}
Jawaban yang lebih modern untuk pertanyaan lama:
MainActivity.kt
private var myMenuIconEnabled by Delegates.observable(true) { _, old, new ->
if (new != old) invalidateOptionsMenu()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<Button>(R.id.my_button).setOnClickListener { myMenuIconEnabled = false }
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main_activity, menu)
return super.onCreateOptionsMenu(menu)
}
override fun onPrepareOptionsMenu(menu: Menu): Boolean {
menu.findItem(R.id.action_my_action).isEnabled = myMenuIconEnabled
return super.onPrepareOptionsMenu(menu)
}
menu_main_activity.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/action_my_action"
android:icon="@drawable/ic_my_icon_24dp"
app:iconTint="@drawable/menu_item_icon_selector"
android:title="My title"
app:showAsAction="always" />
</menu>
menu_item_icon_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?enabledMenuIconColor" android:state_enabled="true" />
<item android:color="?disabledMenuIconColor" />
attrs.xml
<resources>
<attr name="enabledMenuIconColor" format="reference|color"/>
<attr name="disabledMenuIconColor" format="reference|color"/>
</resources>
styles.xml or themes.xml
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="disabledMenuIconColor">@color/white_30_alpha</item>
<item name="enabledMenuIconColor">@android:color/white</item>
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.item_id:
//Your Code....
item.setEnabled(false);
break;
}
return super.onOptionsItemSelected(item);
}
Apa yang saya lakukan adalah menyimpan referensi ke Menu di onCreateOptionsMenu
. Ini mirip dengan jawaban nir kecuali alih-alih menyimpan setiap item, saya menyimpan seluruh menu.
Deklarasikan Menu Menu toolbarMenu;
.
Kemudian di onCreateOptionsMenu
simpan menu ke variabel Anda
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main_menu, menu);
toolbarMenu = menu;
return true;
}
Sekarang Anda dapat mengakses menu Anda dan semua itemnya kapan saja Anda mau.
toolbarMenu.getItem(0).setEnabled(false);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.home, menu);
return false;
}
Jika terlihat menu
menu.findItem(R.id.id_name).setVisible(true);
Jika sembunyikan menu
menu.findItem(R.id.id_name).setVisible(false);
Secara umum dapat mengubah properti tampilan Anda di runtime:
(Button) item = (Button) findViewById(R.id.idBut);
lalu...
item.setVisibility(false)
tapi
jika Anda ingin memodifikasi visibilitas opsi dari ContextMenu, pada tekan tombol Anda, Anda dapat mengaktifkan bendera, dan kemudian di onCreateContextMenu Anda dapat melakukan sesuatu seperti ini:
@Override
public void onCreateContextMenu(ContextMenu menu,
View v,ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle(R.string.context_title);
if (flagIsOn()) {
addMenuItem(menu, "Option available", true);
} else {
Toast.makeText(this, "Option not available", 500).show();
}
}
saya harap ini membantu
onCreateContextMenu
metode. Tapi saya ingin mengakses menu konteks dari metode ini.
onCreateContextMenu
akan dipanggil hanya sekali, tetapi saya dapat mengklik tombol banyak waktu untuk mengaktifkan / menonaktifkan item menu.
setEnable()
tidak mengubah apa yang terjadi ketika Anda menekan menu ini tetapi tidak mengubah tampilannya (apa yang salah, pengembang Android?). Jadi lebih jelas untuk menonaktifkan dan mengubah judul, atau lebih baik buat yangMenuItem
tidak terlihat.