У меня есть панель действий с элементом меню. Как я могу скрыть/показать этот пункт меню?
Это то, что я пытаюсь сделать:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
У меня есть панель действий с элементом меню. Как я могу скрыть/показать этот пункт меню?
Это то, что я пытаюсь сделать:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
Получите MenuItem
, указывающий на такой элемент, вызовите setVisible
на нем, чтобы настроить его видимость, а затем вызовите invalidateOptionsMenu()
в своей деятельности, чтобы соответствующим образом настроить меню ActionBar.
Обновление: A MenuItem
не является регулярным представлением этой части вашего макета. Это нечто особенное, совершенно другое. Ваш код возвращает null
для item
и что приводит к сбою. Вместо этого вам нужно сделать:
MenuItem item = menu.findItem(R.id.addAction);
Вот последовательность:
первый вызов invalidateOptionsMenu()
, а затем внутри onCreateOptionsMenu(Menu)
получить ссылку на MenuItem (путем вызова menu.findItem()
) и вызвать setVisible()
на нем
Найдено добавление к этому вопросу:
Если вы хотите изменить видимость ваших пунктов меню в пути, вам просто нужно установить переменную-член в своей деятельности, чтобы помнить, что вы хотите скрыть это меню и вызвать invalidateOptionsMenu()
и скрыть элементы в вашем переопределенном onCreateOptionsMenu(...)
.
//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);
}
}
В моем примере я скрыл все элементы.
Да.
invalidateOptionsMenu()
, если вы хотите скрыть эту опцию. Это вызовет onCreateOptionsMenu()
.onCreateOptionsMenu()
проверьте флажок/условие и покажите или
скрыть его следующим образом:MenuItem item = menu.findItem(R.id.menu_Done); if (flag/condition)) { item.setVisible(false); } else { }
Вы можете вызвать это:
MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);
Update:
Убедитесь, что ваш код не возвращает null
для item
или может привести к сбою приложения.
не работал у меня. Я должен был явно использовать onPrepareOptionsMenu
, чтобы установить элемент невидимым.
Поэтому используйте onCreateOptionsMenu
для создания меню и onPrepareOptionsMenu
для изменения видимости и т.д.
Я искал ответ с небольшим контекстом. Теперь, когда я понял это, я добавлю этот ответ.
По умолчанию кнопка совместного доступа будет скрыта, как установлено 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>
Однако кнопка share может быть необязательно показана на основе некоторого условия.
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;
}
Ответ P1r4nh4 отлично работает, я просто упростил его с помощью логического флага:
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);
}
}
Это работало для меня как из Activity, так и для Fragment
@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);
}
Изначально установите видимость элемента меню в false в файле макета меню следующим образом:
<?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>
Затем вы можете просто установить видимость элемента меню на false в вашем onCreateOptionsMenu() после раздувания меню.
@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);
}
}
установить значение переменной и вызвать invalidateOptionsMenu();
например
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);
}
fooobar.com/questions/27902/... - ответил Look Alterno и Sufian
.
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(); он просто обновляет меню напрямую.
Мой someMethod() вызывается из нескольких мест, даже раньше onCreateOptionsMenu(), поэтому я должен проверить mMenu!= null.
Вы можете использовать toolbar.getMenu().clear();
, чтобы скрыть сразу все пункты меню
Если вы сделали все, как в приведенных выше ответах, но элемент меню все еще отображается, убедитесь, что вы ссылаетесь на уникальный ресурс. Например, в onCreateOptionsMenu или onPrepareOptionsMenu
@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 и убедитесь, что он существует только в одном файле меню. Если этот ресурс уже используется в любом месте и загружен в действие, он попытается скрыть его.
Согласно официальному сайту разработчиков Android, OnCreateOptionMenu (меню меню) не рекомендуется для изменения элементов меню или значков, видимость..etc во время выполнения.
После того, как система вызывает onCreateOptionsMenu(), она сохраняет экземпляр введенного вами меню и не будет вызывать onCreateOptionsMenu() еще раз, если по какой-либо причине меню недействительно. Однако вы должны использовать onCreateOptionsMenu() только для создания начального состояния меню, а не для внесения изменений в течение жизненного цикла активности.
Если вы хотите изменить меню опций на основе событий, которые происходят во время жизненного цикла активности, вы можете сделать это в методе onPrepareOptionsMenu(). Этот метод передает вам объект Menu, поскольку он существует, поэтому вы можете его изменить, например, добавить, удалить или отключить элементы. (Фрагменты также предоставляют обратный вызов onPrepareOptionsMenu().) - Официальный сайт AndroidDeveloper -
Как рекомендуемый Вы можете использовать этот onOptionsItemSelected (элемент MenuItem) метод отслеживания пользовательских входов.
@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);
}
Если вам нужно изменить элементы меню во время выполнения, вы можете использовать onPrepareOptionsMenu (меню меню), чтобы изменить их
@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;
}
Для тех, кто использует библиотеку Appcompat: Если в подклассе Activity Action Action (ActionBarActivity) вы можете вызвать supportInvalidateOptionsMenu()
Видел здесь: fooobar.com/questions/27904/...
Я думаю, что лучшим подходом было бы использовать переменную-член для меню, инициализировать ее в onCreateOptionsMenu() и просто использовать setVisible(), не нарушая при этом меню опций.
Лучший способ скрыть все элементы в меню только одной командой - использовать "группу" в вашем меню xml. Просто добавьте все пункты меню, которые будут в вашем меню переполнения внутри одной группы.
В этом примере у нас есть два пункта меню, которые всегда будут отображаться (обычный элемент и поиск) и три элемента переполнения:
<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>
Затем, в своей деятельности (предпочтительно в onCreateOptionsMenu), используйте команду setGroupVisible, чтобы установить видимость всех элементов меню как false или true.
public boolean onCreateOptionsMenu(Menu menu) {
menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
Если вы хотите использовать эту команду где-нибудь еще в своей деятельности, обязательно сохраните класс меню на локальном компьютере и всегда проверяйте, является ли меню нулевым, потому что вы можете выполнить перед createOptionsMenu:
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
}
этот код работал у меня
@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);
}