Bir menuitem ile bir eylem çubuğum var. Bu menü öğesini nasıl gizleyebilir / gösterebilirim?
Ben yapmaya çalışıyorum:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
Bir menuitem ile bir eylem çubuğum var. Bu menü öğesini nasıl gizleyebilir / gösterebilirim?
Ben yapmaya çalışıyorum:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
Yanıtlar:
Bir Get MenuItem
böyle öğeye işaret, çağrı setVisible
üzerine görünürlüğünü ayarlamak ve sonra aramaya invalidateOptionsMenu()
İşlem Çubuğu menüsü buna göre ayarlanır böylece aktivitesi üzerine.
Güncelleme: A MenuItem
, düzeninizin bir parçası olan normal bir görünüm değil. Özel, tamamen farklı bir şey. Kodunuz döner null
için item
ve bu çökmesine neden olan en. Bunun yerine ihtiyacınız olan şey:
MenuItem item = menu.findItem(R.id.addAction);
İlk arama: Burada çağırmalıdır hangi dizisidir invalidateOptionsMenu()
içeride sonra ve onCreateOptionsMenu(Menu)
(çağırarak Menuıtem başvurusu elde menu.findItem()
) ve çağrı setVisible()
üzerine
MenuItem
olabilirsiniz . Hem kodunuzu hem de kilitlenme günlüğünü görmeden asla bilemeyiz. null
getItem
findItem
onCreateOptionsMenu
ve öğenin görünürlüğünü o noktada ayarlayın. Ya da görünür olup olmayacağına karar verene kadar referansı yanınızda bulundurun.
invalidateOptionsMenu()
ve daha sonra içeride (arayarak ) onCreateOptionsMenu(Menu)
bir referans almak ve çağırmaktır . Cevaplar suhas_sm tarafından ve P1r4nh4 tarafından doğru bir yaklaşım sunuyoruz. MenuItem
menu.findItem()
setVisible()
Bu soru için bir zeyilname bulundu:
Menü öğelerinizin hareket halindeyken görünürlüğünü değiştirmek istiyorsanız, menüyü invalidateOptionsMenu()
gizlemek ve geçersiz kılınan onCreateOptionsMenu(...)
yönteminizdeki öğeleri aramak ve gizlemek istediğinizi hatırlamak için etkinliğinizde bir üye değişkeni ayarlamanız yeterlidir .
//anywhere in your code
...
mState = HIDE_MENU; // setting state
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// inflate menu from xml
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.settings, menu);
if (mState == HIDE_MENU)
{
for (int i = 0; i < menu.size(); i++)
menu.getItem(i).setVisible(false);
}
}
Örneğimde tüm öğeleri gizledim.
if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }
Dokümanlar şunu gösterir: "Menünün görüntülenmesi için true değerini döndürmeniz gerekir; false değerini döndürürseniz gösterilmez".
onPrepareOptionsMenu()
onCreateOptionsMenu()
yalnızca bir kez çağrıldığı için show / hide mantığı için kullanılmalıdır, bu nedenle başlatma işleminden sonra menü öğelerini değiştirmek isterseniz yararlı olmaz. Bu yüzden onCreate'a şişirin, ancak onPrepare'de gösterin / gizleyin.
Evet.
invalidateOptionsMenu()
Seçeneği gizlemek istediğinizde arayın . Bu arayacak onCreateOptionsMenu()
.onCreateOptionsMenu()
, bayrağı / koşulu kontrol edin ve aşağıdaki şekilde gösterin veya gizleyin:MenuItem item = menu.findItem(R.id.menu_Done); if (flag/condition)) { item.setVisible(false); } else { }
invalidateOptionsMenu
yerine olmamalı mı invalidateOptions
?
onCreateOptionsMenu
Buna şöyle diyebilirsiniz:
MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);
Güncelleme:
Emin kodunuzu döndürür vermez Make null
için item
veya uygulamayı çökebilir.
Biraz daha bağlamlı bir cevap arıyordum. Şimdi anladım, bu cevabı ekleyeceğim.
Varsayılan olarak paylaş düğmesi, ayarlandığı şekilde gizlenir android:visible="false"
.
main_menu.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">
<!-- hide share button by default -->
<item
android:id="@+id/menu_action_share"
android:icon="@drawable/ic_share_white_24dp"
android:visible="false"
android:title="Share"
app:showAsAction="always"/>
<item
android:id="@+id/menu_action_settings"
android:icon="@drawable/ic_settings_white_24dp"
android:title="Setting"
app:showAsAction="ifRoom"/>
</menu>
Ancak paylaş düğmesi isteğe bağlı olarak bazı koşullara göre gösterilebilir.
MainActivity.java
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
MenuItem shareItem = menu.findItem(R.id.menu_action_share);
// show the button when some condition is true
if (someCondition) {
shareItem.setVisible(true);
}
return true;
}
invalidateOptionsMenu()
menüyü yenilemek için kullanın.
benim için çalışmadı. onPrepareOptionsMenu
Görünmez bir öğeyi ayarlamak için açıkça kullanmak zorunda kaldım .
Bu yüzden onCreateOptionsMenu
menüyü oluşturmak ve onPrepareOptionsMenu
görünürlüğü değiştirmek için kullanın.
onPrepareOptionsMenu
bu tür bir işlem yapmak için doğru yer gibi görünüyor: "Ekranın standart seçenekler menüsünü görüntülenecek şekilde hazırlayın. Bu, menü gösterilmeden hemen önce, her gösterildiğinde çağrılır Bu yöntemi, öğeleri etkin bir şekilde etkinleştirmek / devre dışı bırakmak veya içeriği dinamik olarak değiştirmek için kullanabilirsiniz. "
invalidateOptionsMenu()
menüyü yenilemek için kullanın.
Başlangıçta menü düzeni dosyasında menü öğesi görünürlüğünü false olarak ayarlayın:
<?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:visible="false"
android:id="@+id/action_do_something"
android:title="@string/txt_do_something"
app:showAsAction="always|withText"
android:icon="@drawable/ic_done"/>
</menu>
Ardından, menüyü şişirdikten sonra onCreateOptionsMenu () öğenizde menü öğesinin görünürlüğünü false olarak ayarlayabilirsiniz.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(menu,R.menu.menu);
MenuItem item = menu.findItem(R.id.menuItemId);
if (item != null){
item.setVisible(false);
}
}
Bunu dene:
MenuItem myitem = menu.findItem(R.id.my_item);
myitem.setVisible(false);
Bu benim için hem Etkinlik hem de Parçadan işe yaradı
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if (menu.findItem(R.id.action_messages) != null)
menu.findItem(R.id.action_messages).setVisible(false);
}
P1r4nh4 cevap iyi çalışıyor, ben sadece bir boole bayrağı kullanarak basitleştirdim:
public int mState = 0; //at the top of the code
//where you want to trigger the hide action
mState = 1; // to hide or mState = 0; to show
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// inflate menu from xml
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.settings, menu);
if (mState == 1) //1 is true, 0 is false
{
//hide only option 2
menu.getItem(2).setVisible(false);
}
}
0
ve 1
bir "boolean bayrak", 's sözde boolean değildir. ayrıca burada gerçek bir boole kullanmak için hiçbir neden yoktur.
Android Geliştirici Resmi sitesine göre, Menü öğelerini veya simgelerini değiştirmek için OnCreateOptionMenu (Menü menüsü), Çalışma Zamanı'nda görünürlük .. vb.
Sistem onCreateOptionsMenu () yöntemini çağırdıktan sonra, doldurduğunuz Menünün bir örneğini korur ve menü herhangi bir nedenle geçersiz kılınmadıkça onCreateOptionsMenu () yöntemini tekrar çağırmaz. Ancak, onCreateOptionsMenu () yöntemini yalnızca başlangıç menü durumunu oluşturmak ve etkinlik yaşam döngüsü sırasında değişiklik yapmak için kullanmamalısınız.
Etkinlik yaşam döngüsü sırasında meydana gelen olaylara bağlı olarak seçenekler menüsünü değiştirmek isterseniz, bunu onPrepareOptionsMenu () yönteminde yapabilirsiniz. Bu yöntem, şu anda varolan Menü nesnesini iletir; böylece öğeleri ekleme, kaldırma veya devre dışı bırakma gibi değiştirebilirsiniz. (Parçalar ayrıca bir onPrepareOptionsMenu () geri çağrısı sağlar .) --AndroidDeveloper Resmi Sitesi -
Önerilen Olarak Bu onOptionsItemSelected (MenuItem öğesi) yöntemini kullanıcı girişlerini izlemek için kullanabilirsiniz.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.edit) {
Intent intent = new Intent(this, ExampleActivity.class);
intent.putExtra(BUNDLE_KEY, mConnection);
startActivityForResult(intent, PICK_CHANGE_REQUEST);
return true;
} else if (id == R.id.delete) {
showDialog(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Menü Öğelerini Çalışma zamanında değiştirmeniz gerekirse, değiştirmek için onPrepareOptionsMenu (Menü menüsü) seçeneğini kullanabilirsiniz.
@Override
public boolean onPrepareOptionsMenu(Menu menu){
if (Utils.checkNetworkStatus(ExampleActivity.this)) {
menu.findItem(R.id.edit).setVisible(true);
menu.findItem(R.id.delete).setVisible(true);
}else {
menu.findItem(R.id.edit).setVisible(false);
menu.findItem(R.id.delete).setVisible(false);
}
return true;
}
setVisible(false)
her zaman görünür öğe için ben üç noktaya (Menü'nin kendisi) tıklayana kadar kaybolmaz. Ben kullanırsanız invalidateOptionsMenu()
içinde onPrepareOptionsMenu
hemen kendini yeniden organize öğeler, ama onların eylemleri gevşek (Ben herhangi bir öğeyi tıklayarak, eğer hiçbir şey yapmaz).
bir değişkene bir değer ayarlayın ve invalidateOptionsMenu () öğesini çağırın;
Örneğin
selectedid=arg2;
invalidateOptionsMenu();
public boolean onPrepareOptionsMenu(Menu menu) {
if(selectedid==1){
menu.findItem(R.id.action_setting).setVisible(false);
menu.findItem(R.id.action_s2).setVisible(false);
menu.findItem(R.id.action_s3).setVisible(false);
}
else{
if(selectedid==2){
menu.findItem(R.id.action_search).setVisible(false);
menu.findItem(R.id.action_s4).setVisible(false);
menu.findItem(R.id.action_s5).setVisible(false);
}
}
return super.onPrepareOptionsMenu(menu);
}
setVisible(false)
her zaman görünür öğe için ben üç noktaya (Menü'nin kendisi) tıklayana kadar kaybolmaz. Ben kullanırsanız invalidateOptionsMenu()
içinde onPrepareOptionsMenu
hemen kendini yeniden organize öğeler, ama onların eylemleri gevşek (Ben herhangi bir öğeyi tıklayarak, eğer hiçbir şey yapmaz).
toolbar.getMenu().clear();
Tüm menü öğelerini bir kerede gizlemek için kullanabilirsiniz
Menüdeki tüm öğelerin Görünürlüğü ayarlandığında, uygulama çubuğu menüsü veya taşma menüsü Otomatik olarak gizle olur
Misal
private Menu menu_change_language;
...
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
...
...
menu_change_language = menu;
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(true);
return super.onCreateOptionsMenu(menu);
}
Diğer parçaya gitmeden önce aşağıdaki kodu kullanın:
if(menu_change_language != null){
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(false);
}
https://stackoverflow.com/a/21215280/466363 - Cevap Alterno ve Sufian tarafından
.
private Menu mMenu;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.track_fragment, menu);
mMenu = menu;
}
...
private void someMethod() {
...
if (mMenu != null) {
MenuItem item = mMenu.findItem(R.id.new_track);
if (item != null) {
item.setVisible(false);
ActivityCompat.invalidateOptionsMenu(this.getActivity());
}
}
...
}
ActivityCompat.invalidateOptionsMenu (), onPrepareOptionsMenu () 'da geri aramaz; sadece menüyü doğrudan güncelleyin.
Benim someMethod () bile onCreateOptionsMenu () önce birkaç yerden çağırılır, bu yüzden mMenu! = Null kontrol gerekir.
Her şeyi yukarıdaki yanıtlarda olduğu gibi yaptıysanız, ancak bir menü öğesi hala görünürse, benzersiz kaynağa başvurduğunuzdan emin olun . Örneğin, onCreateOptionsMenu veya onPrepareOptionsMenu'da
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem menuOpen = menu.findItem(R.id.menu_open);
menuOpen.setVisible(false);
}
Ctrl + R.id.menu_open'e tıklayın ve yalnızca bir menü dosyasında var olup olmadığını kontrol edin. Bu kaynağın zaten herhangi bir yerde kullanıldığı ve bir etkinliğe yüklendiği durumda, orada saklanmaya çalışır.
Bir menüdeki tüm öğeleri tek bir komutla gizlemenin en iyi yolu xml menünüzde "grup" kullanmaktır. Taşma menünüzde olacak tüm menü öğelerini aynı grubun içine eklemeniz yeterli.
Bu örnekte her zaman gösterilecek iki menü öğesi (normal öğe ve arama) ve üç taşma öğesi vardır:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/someItemNotToHide1"
android:title="ITEM"
app:showAsAction="always" />
<item
android:id="@+id/someItemNotToHide2"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="android.support.v7.widget.SearchView"
android:title="Search"/>
<group android:id="@+id/overFlowItemsToHide">
<item android:id="@+id/someID"
android:orderInCategory="1" app:showAsAction="never" />
<item android:id="@+id/someID2"
android:orderInCategory="1" app:showAsAction="never" />
<item android:id="@+id/someID3"
android:orderInCategory="1" app:showAsAction="never" />
</group>
</menu>
Ardından, etkinliğinizde (onCreateOptionsMenu'da tercih edilir), tüm menü öğelerinin görünürlüğünü false veya true olarak ayarlamak için setGroupVisible komutunu kullanın.
public boolean onCreateOptionsMenu(Menu menu) {
menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
Bu komutu etkinliğinizin başka bir yerinde kullanmak istiyorsanız, menü sınıfını yerel olarak kaydettiğinizden emin olun ve her zaman menünün boş olup olmadığını kontrol edin, çünkü createOptionsMenu'dan önce çalıştırabilirsiniz:
Menu menu;
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
}
public void hideMenus() {
if (menu != null) menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
Appcompat kitaplığını kullananlar için: Activity alt sınıflarınız ActionBarActivity ise, supportInvalidateOptionsMenu () öğesini çağırabilirsiniz.
Burada görüldü: https://stackoverflow.com/a/19649877/1562524
Ben daha iyi bir yaklaşım menü için üye değişkeni kullanmak, onCreateOptionsMenu () başlangıç ve seçenekler menüsünü geçersiz kılma, sonradan setVisible () kullanmak olacağını düşünüyorum.
bu kod benim için çalıştı
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu,menu);
if (Application.sharedPreferences.getInt("type",1) == 2)
{
menuItem = menu.findItem(R.id.menu_travel_orders);
menuItem.setVisible(false);
}
return super.onCreateOptionsMenu(menu);
}
Bu Yaklaşım benim için çalıştı:
private Menu thismenu;
if (condition)
{
if(thismenu != null)
{
thismenu.findItem(R.id.menu_save).setVisible(true);
Toast.makeText(ProfileActivity.this,
""+thismenu.findItem(R.id.menu_save).getTitle(),
Toast.LENGTH_SHORT).show();
}else
{
thismenu.findItem(R.id.menu_save).setVisible(false);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.profile_menu, menu);
thismenu = menu;
return true;
}
Bir aktiviteden, kapsama erişimi olmayan bir menü öğesine erişmeye çalışıyorsunuz. Görünüm ne etkinlik ne de düzen ile bağlı olmadığından, menü öğesini bulma çağrısı null değerini döndürür de aradığınız .
Menü öğeleri, " Gezinme Çubuğu " gibi karşılık gelen etkinliğe bağlanan öğelerle bağlanır.
Bu nedenle, etkinlikteki bu görünümleri () başlatın ve ardından bu görünümleri içeren menü öğelerine erişin.
Navigation navView;
navView = findViewById(R.id.navigationView);
MenuItem item = navView.getMenu().findItem(R.id.item_hosting);
item.setVisible(false);
kullanım invalidateOptionsMenu()
aramak için onPrepareOptionsMenu(menu: Menu?)
onCreateOptionsMenu () yöntemini yalnızca başlangıç menü durumunu oluşturmak ve etkinlik yaşam döngüsü sırasında değişiklik yapmak için kullanmamalısınız ...
Bir olay meydana geldiğinde ve bir menü güncellemesi gerçekleştirmek istediğinizde, sisteminPrepareOptionsMenu () çağrılmasını istemek için invalidateOptionsMenu () öğesini çağırmanız gerekir.
Android kotlin, gizleme veya eylem çubuğunda bir menü öğesinin görünürlüğünü programlı olarak ayarlayın.
override fun onCreateOptionsMenu(menu: Menu): Boolean {
val inflater = menuInflater
inflater.inflate(R.menu.main_menu, menu)
val method = menu.findItem(R.id.menu_method)
method.isVisible = false //if want to show set true
return super.onCreateOptionsMenu(menu)
}