我有一个带有菜单项的操作栏。如何隐藏/显示该菜单项?
这就是我想要做的:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
我有一个带有菜单项的操作栏。如何隐藏/显示该菜单项?
这就是我想要做的:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
Answers:
获取一个MenuItem
指向这样的项目,调用setVisible
它来调整其知名度,然后调用invalidateOptionsMenu()
所以动作条菜单进行相应的调整你的活动。
更新: A MenuItem
不是常规视图,它是布局的一部分。它与众不同,完全不同。您的代码返回null
,item
导致崩溃。您需要做的是:
MenuItem item = menu.findItem(R.id.addAction);
下面是你应该调用顺序:先调用invalidateOptionsMenu()
,然后里面onCreateOptionsMenu(Menu)
获得的菜单项的引用(通过调用menu.findItem()
),并调用setVisible()
就可以了
MenuItem
可能是null
因为您使用getItem
而不是findItem
。我们永远不会知道,而没有看到您的代码和崩溃日志。
onCreateOptionsMenu
,然后在该点设置项的可见性即可。或者保留参考,直到您决定是否应该看到它。
找到了这个问题的附录:
如果要随时更改菜单项的可见性,只需在活动中设置一个成员变量,以记住要隐藏菜单并调用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);
}
}
在我的示例中,我隐藏了所有项目。
if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }
docs状态:“要显示的菜单必须返回true;如果返回false,则不会显示”。
onPrepareOptionsMenu()
应该用于显示/隐藏逻辑,而不是 onCreateOptionsMenu()
因为它仅被调用一次,因此如果您想在初始化后更改菜单项,则没有用。因此,请在onCreate中充气,但在onPrepare中显示/隐藏。
是。
invalidateOptionsMenu()
要隐藏该选项时,请致电。这会打电话onCreateOptionsMenu()
。onCreateOptionsMenu()
,检查标记/条件,并按以下方式显示或隐藏它:MenuItem item = menu.findItem(R.id.menu_Done); if (flag/condition)) { item.setVisible(false); } else { }
invalidateOptionsMenu
不是invalidateOptions
?
onCreateOptionsMenu
我一直在寻找具有更多上下文的答案。现在我已经弄清楚了,我将添加该答案。
默认情况下,按设置,共享按钮将被隐藏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;
}
invalidateOptionsMenu()
刷新菜单。
没有为我工作。我必须明确使用onPrepareOptionsMenu
将项目设置为不可见。
因此,用于onCreateOptionsMenu
创建菜单和onPrepareOptionsMenu
更改可见性等。
onPrepareOptionsMenu
似乎是进行此类操作的正确位置:“准备要显示的屏幕标准选项菜单。每次显示菜单时都会调用此菜单。您可以使用此方法有效地启用/禁用项目,或以其他方式动态地修改内容。”
invalidateOptionsMenu()
刷新菜单。
最初将菜单项可见性在菜单布局文件中设置为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()中将菜单项的可见性简单地设置为false。
@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);
}
}
尝试这个:
MenuItem myitem = menu.findItem(R.id.my_item);
myitem.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);
}
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);
}
}
0
和1
不是“布尔标志”,它是伪布尔。此外,这里没有理由使用实际的布尔值。
根据Android开发人员官方网站的说法,建议不要在运行时更改菜单项或图标,可见性等来推荐OnCreateOptionMenu(菜单菜单)。
系统调用onCreateOptionsMenu()之后,它将保留您填充的Menu的实例,并且除非菜单由于某种原因而无效,否则不会再次调用onCreateOptionsMenu()。但是,应仅使用onCreateOptionsMenu()来创建初始菜单状态,而不能在活动生命周期内进行更改。
如果要基于活动生命周期中发生的事件来修改选项菜单,则可以在onPrepareOptionsMenu()方法中进行操作。该方法将当前存在的Menu对象传递给您,以便您可以对其进行修改,例如添加,删除或禁用项目。(片段还提供了onPrepareOptionsMenu()回调。)-- AndroidDeveloper官方网站-
推荐您可以使用此onOptionsItemSelected(MenuItem item)方法跟踪用户输入。
@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;
}
setVisible(false)
选择始终可见的项目时,直到单击三个点(菜单本身)后,该项目才会消失。如果我invalidateOptionsMenu()
在onPrepareOptionsMenu
项目中使用,则立即对其进行自我重组,但它们会松开动作(如果我单击任何项目,则不会执行任何操作)。
为变量设置值并调用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);
}
setVisible(false)
选择始终可见的项目时,直到单击三个点(菜单本身)后,该项目才会消失。如果我invalidateOptionsMenu()
在onPrepareOptionsMenu
项目中使用,则立即对其自身进行重组,但它们会松开动作(如果我单击任何项目,则不会执行任何操作)。
通过设置菜单中所有项目的可见性,应用程序栏菜单或溢出菜单将自动隐藏
例
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);
}
https://stackoverflow.com/a/21215280/466363-由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。
如果您按照上述答案进行了所有操作,但是菜单项仍然可见,请检查是否引用了唯一资源。例如,在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并检查它是否仅存在于一个菜单文件中。如果此资源已在任何地方使用并加载到活动中,它将尝试隐藏在那里。
仅用一个命令隐藏菜单中所有项目的最好方法是在菜单xml中使用“ group”。只需在同一组内的溢出菜单中添加所有菜单项即可。
在此示例中,我们将始终显示两个菜单项(常规项和搜索)和三个溢出项:
<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
}
如果要在活动的其他任何地方使用此命令,请确保将菜单类保存到本地,并始终检查menu是否为null,因为可以在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
}
对于那些使用Appcompat库的用户:如果您的Activity子类为ActionBarActivity,则可以调用supportInvalidateOptionsMenu()
我认为更好的方法是对菜单使用成员变量,在onCreateOptionsMenu()中对其进行初始化,然后仅使用setVisible(),而不会使选项菜单无效。
这段代码对我有用
@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;
}
采用 invalidateOptionsMenu()
为了打电话 onPrepareOptionsMenu(menu: Menu?)
您只应使用onCreateOptionsMenu()来创建初始菜单状态,而不能在活动生命周期内进行更改...
当事件发生并且您想要执行菜单更新时,必须调用invalidateOptionsMenu()来请求系统调用onPrepareOptionsMenu()。
Android kotlin,以编程方式隐藏或设置操作栏中菜单项的可见性。
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)
}