Sti*_*tán 325 android menuitem android-menu android-actionbar
我有一个带有menuitem的操作栏.如何隐藏/显示该菜单项?
这就是我想要做的:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
Run Code Online (Sandbox Code Playgroud)
K-b*_*llo 458
获取MenuItem
指向此类项目,调用setVisible
它以调整其可见性,然后调用invalidateOptionsMenu()
您的活动,以便相应地调整ActionBar菜单.
更新: A MenuItem
不是您的布局的常规视图.它的特殊之处,完全不同.你的代码返回null
了item
,并且是造成死机.你需要做的是:
MenuItem item = menu.findItem(R.id.addAction);
Run Code Online (Sandbox Code Playgroud)
这是你应该调用的顺序:首先调用invalidateOptionsMenu()
然后在里面onCreateOptionsMenu(Menu)
获取对MenuItem的引用(通过调用menu.findItem()
)并调用setVisible()
它
P1r*_*nh4 153
找到这个问题的附录:
如果您想在旅途中更改菜单项的可见性,您只需在活动中设置成员变量即可记住您要隐藏菜单并调用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);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的例子中,我隐藏了所有项目.
suh*_*_sm 86
是.
invalidateOptionsMenu()
当您要隐藏选项时调用.这会打电话onCreateOptionsMenu()
.onCreateOptionsMenu()
,检查标志/条件,并按以下方式显示或隐藏它:Run Code Online (Sandbox Code Playgroud)MenuItem item = menu.findItem(R.id.menu_Done); if (flag/condition)) { item.setVisible(false); } else { }
eli*_*ias 37
你可以这样称呼:
MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);
Run Code Online (Sandbox Code Playgroud)
更新:
确保您的代码没有返回null
,item
否则可能会导致应用程序崩溃.
Sur*_*gch 30
我正在寻找一个更多背景的答案.现在我已经弄明白了,我会补充一下这个答案.
默认情况下,共享按钮将被隐藏,如下所示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>
Run Code Online (Sandbox Code Playgroud)
但是可以根据某些条件选择显示共享按钮.
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;
}
Run Code Online (Sandbox Code Playgroud)
hot*_*zen 23
不适合我.我必须明确地使用onPrepareOptionsMenu
设置项目不可见.
因此,用于onCreateOptionsMenu
创建菜单和onPrepareOptionsMenu
更改可见性等.
小智 7
最初在菜单布局文件中将菜单项可见性设置为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>
Run Code Online (Sandbox Code Playgroud)
然后,您可以在充气菜单后在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);
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说既有活动也有片段
@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);
}
Run Code Online (Sandbox Code Playgroud)
小智 7
只需一个命令即可隐藏菜单中所有项目的最佳方法是在菜单 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>
Run Code Online (Sandbox Code Playgroud)
然后,在您的 Activity 上(最好在 onCreateOptionsMenu 上),使用命令 setGroupVisible 将所有菜单项可见性设置为 false 或 true。
public boolean onCreateOptionsMenu(Menu menu) {
menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
Run Code Online (Sandbox Code Playgroud)
如果您想在 Activity 的其他任何地方使用此命令,请务必将菜单类保存到本地,并始终检查菜单是否为空,因为您可以在 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
}
Run Code Online (Sandbox Code Playgroud)
小智 6
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);
}
}
Run Code Online (Sandbox Code Playgroud)
根据 Android 开发者官方网站,不建议使用 OnCreateOptionMenu(Menu menu) 在运行时更改菜单项或图标、可见性等。
在系统调用 onCreateOptionsMenu() 之后,它会保留您填充的 Menu 的一个实例并且不会再次调用 onCreateOptionsMenu() 除非菜单因某种原因失效。但是,您应该仅使用 onCreateOptionsMenu() 来创建初始菜单状态,而不要在活动生命周期中进行更改。
如果要根据活动生命周期期间发生的事件修改选项菜单,可以在 onPrepareOptionsMenu() 方法中进行。此方法向您传递当前存在的 Menu 对象,以便您可以对其进行修改,例如添加、删除或禁用项目。(Fragments 还提供了 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);
}
Run Code Online (Sandbox Code Playgroud)
如果您需要在运行时更改菜单项,您可以使用onPrepareOptionsMenu(Menu menu)来更改它们
@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;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
尝试这个:
MenuItem myitem = menu.findItem(R.id.my_item);
myitem.setVisible(false);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
301749 次 |
最近记录: |