我有一个菜单项的操作栏。 如何隐藏/显示该菜单项?
这就是我想要做的事:
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()
在你的活动,这样的动作条菜单进行相应的调整。
更新:一个MenuItem
是不是正规的观点,即是你的布局的一部分。 它的一些特别的东西,完全不同。 你的代码返回null
的item
而这导致崩溃。 你所需的是要做到:
MenuItem item = menu.findItem(R.id.addAction);
下面是你应该调用顺序:先调用invalidateOptionsMenu()
然后里面onCreateOptionsMenu(Menu)
获得的菜单项的引用(通过调用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);
更新:
请确保您的代码不返回null
的item
或可能导致应用程序崩溃。
我一直在寻找多一点的上下文答案。 现在,我已经想通了,我将添加答案。
默认情况下,分享按钮将被隐藏,如设置由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>
但共享按钮可以可选地基于某一条件被显示。
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;
}
我没有工作。 我必须明确地使用onPrepareOptionsMenu
来设置为不可见的项目。
因此,使用onCreateOptionsMenu
创建菜单和onPrepareOptionsMenu
改变知名度等
这为我工作从两个活动和片段
@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);
}
最初设置的菜单项知名度假的菜单布局文件,如下所示:
<?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>
然后,您可以简单地膨胀后,在菜单设置菜单项,在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);
}
}
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);
}
}
的值设置为变量并调用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);
}
您可以使用toolbar.getMenu().clear();
隐藏在一旦所有菜单项
据Android开发者官方网站,OnCreateOptionMenu(菜单菜单)不推荐用于在运行时更改菜单项或图标,visibility..etc。
系统调用onCreateOptionsMenu()后,它保留您填充菜单的实例,并再次除非菜单无效由于某种原因不会调用onCreateOptionsMenu()。 但是,你应该使用onCreateOptionsMenu()只创建初始菜单状态,而不是使活动生命周期中的变化。
如果要修改基于活动的生命周期期间发生的事件的选项菜单中,您可以在onPrepareOptionsMenu()方法做到这一点。 因为目前存在这样你就可以修改它,如添加,删除或禁用物品此方法将你的菜单对象。 (片段也提供了一个onPrepareOptionsMenu()回调。) --AndroidDeveloper官方网站-
作为Recomended您可以使用此onOptionsItemSelected(菜单项项)方法追踪用户的输入。
@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;
}
https://stackoverflow.com/a/21215280/466363 -通过查找Alterno和苏菲安回答
。
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。
如果你做的一切都是在上面的答案,但菜单项仍然是可见的,请检查您参考独特的资源。 例如,在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并检查它是否只存在于一个菜单文件。 在此资源已经在任何地方使用,并在活动中加载的情况下,它会试图隐藏在那里。
通过设置菜单中的所有项目的知名度,appbar菜单或溢出菜单会自动隐藏
例
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);
}
临睡前其他片段使用波纹管代码:
if(menu_change_language != null){
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(false);
}
试试这个:
MenuItem myitem = menu.findItem(R.id.my_item);
myitem.setVisible(false);
对于使用程序兼容性库的:如果你的活动子类ActionBarActivity,你可以调用supportInvalidateOptionsMenu()
在这里看到: https://stackoverflow.com/a/19649877/1562524
我认为,更好的方法是使用一个成员变量的菜单,在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);
}
这种方法为我工作:
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;
}
您正在尝试从一个活动,它不具备访问范围内访问的菜单项。 呼叫查找菜单项将返回null,因为观点不符合既不活动,也不您致电布局绑定。
该菜单项绑定的物品,诸如“ 导航栏 ”而这又是与绑定相应的活动。
所以初始化活动()的意见,然后进入菜单项withing该意见。
Navigation navView;
navView = findViewById(R.id.navigationView);
MenuItem item = navView.getMenu().findItem(R.id.item_hosting);
item.setVisible(false);