菜单中的图标在android中不显示
我想将菜单处理程序添加到我的项目中。我也读了,它很简单,但图标没有显示。我很困惑。我甚至以编程方式添加了一个菜单项 我的代码是:菜单中的图标在android中不显示,android,Android,我想将菜单处理程序添加到我的项目中。我也读了,它很简单,但图标没有显示。我很困惑。我甚至以编程方式添加了一个菜单项 我的代码是: @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, 0, 0, "Quit").setIcon(R.drawable.ic_launcher); getMenuInflater().inflate(R.layout.menu, menu); return t
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 0, 0, "Quit").setIcon(R.drawable.ic_launcher);
getMenuInflater().inflate(R.layout.menu, menu);
return true;
}
和xml格式:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Single menu item
Set id, icon and Title for each menu item
-->
<item android:id="@+id/menu_bookmark"
android:icon="@drawable/update"
android:title="@string/Update" />
</menu>
如果您在Android 3.0+上运行代码,则菜单中的图标不会按设计显示。这是谷歌的设计决定
您可以在Android开发者博客上了解更多信息。您可以将item元素中的属性
Android:showAsAction=“always”
添加到XML文件中。然后,它将在操作栏中以图标的形式显示相关的菜单选项
请注意,它将取代菜单中的文本
要进一步阅读,请查看android:showAsAction下的内容。无论系统在何处做出了何种设计选择,您都可以使用中提供的解决方案来规避此问题 代码如下,以确保完整性。在
android.support.v7.app.ActionBarActivity
@Override
public boolean onMenuOpened(int featureId, Menu menu)
{
if(featureId == Window.FEATURE_ACTION_BAR && menu != null){
if(menu.getClass().getSimpleName().equals("MenuBuilder")){
try{
Method m = menu.getClass().getDeclaredMethod(
"setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
}
catch(NoSuchMethodException e){
Log.e(TAG, "onMenuOpened", e);
}
catch(Exception e){
throw new RuntimeException(e);
}
}
}
return super.onMenuOpened(featureId, menu);
}
和xml格式:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Single menu item
Set id, icon and Title for each menu item
-->
<item android:id="@+id/menu_bookmark"
android:icon="@drawable/update"
android:title="@string/Update" />
</menu>
忘记所有这些,执行此步骤。 将app:showsAsAction=“always”添加到您的物品中。如果您使用android:showsAsAction=“always”您将无法获得解决方案。
尝试将应用程序属性添加到您的项目。旧问题,但希望它能帮助其他人 使用以下代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/menu_item_share"
android:title="Share"
app:showAsAction="always"
android:icon="@drawable/share" /></menu>
注意:我使用了
app:showAsAction
而不是android:showAsAction
,经过长时间的尝试,我找到了下面的解决方案,可能有助于其他人节省时间。基本上,“lbarbosa”提供的解决方案,我要衷心感谢他
在前面的答案的基础上尝试了这一点,效果很好,至少在最新版本的支持库(25.1)中是如此:
/*菜单代码*/
/*Java代码*/
@SuppressLint(“RestrictedApi”)
@凌驾
公共布尔onCreateOptions菜单(菜单)
{
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。我的菜单,菜单);
if(菜单生成器的菜单实例){
MenuBuilder m=(MenuBuilder)菜单;
m、 SetOptionalConsVisible(真);
}
返回true;
}
使用android.support.v7.app.AppCompatActivity使图标的输入变得非常困难。您需要实现onMenuOpen
,来自AppComactActivity
类的超级方法。检查后,如果菜单不为空。如果菜单不是空的,则使用布尔值将如下方法类和setoptionaliconvisible
传递为true
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if(menu != null){
if(menu.getClass().getSimpleName().equals("MenuBuilder")){
try{
Method m = menu.getClass().getDeclaredMethod(
"setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
}
catch(NoSuchMethodException e){
Log.e("MAIN", "onMenuOpened", e);
}
catch(Exception e){
throw new RuntimeException(e);
}
}
}
return super.onMenuOpened(featureId, menu);
}
只需在menu.xml中添加这个attr-inside-item标记
app:showAsAction="always
我使用下面的代码将显式图标放在onCreateOptions菜单方法中 对于(int i=0;i
}您的设备运行的是哪一个android版本?4.1.2,但我运行,而且运行起来很好这绝对是android最令人沮丧的问题之一。我不知道为什么它不起作用。他们的文档和你做的完全一样,但不起作用。您好,在androidhive演示中,它显示了低于3.0的版本。如果您在3.0更低的版本2.2、2.3等中运行程序,它将起作用。它说图标不受支持或其他什么,但我运行了,它工作正常,您的活动在不工作时是否扩展了
ActionBarActivity
?两个版本中的目标API是什么?相同的?你是在同一个API级别上构建的吗?不,你是对的,我的API版本是4.1,我使用的示例是3的较低版本。默认设置是不显示它们,但现在你可以显示它们。看Pranob的回答。这几乎对我有效。出于我不理解的原因,featureId值对我来说是0。我用“if(featureId==Window.FEATURE\u OPTIONS\u PANEL&&menu!=null){”替换了第一个if语句,它成功了。尽管我不确定“FEATURE\u OPTION\u PANEL”是否是我的应用程序所获得的0的正确含义。好吧,大多数Java变通方法都适用于Android臭名昭著的嵌入式“最佳实践”(又称开发者API上的苹果)依靠Java反射或直接的源代码复制到项目中(这远没有吸引力,但更安全)例如,使用前一种方法的人会觉得有必要对更改进行过度调整。在这种情况下,仲裁认为调整是针对ActionBar调用的,但可能会有其他有效的调整,例如您的调整,这取决于API级别等等。由于我的featureId是108而不是8,我可以替换featureId==Window.FEATURE\u ACTION\B吗AR
->(featureId&Window.FEATURE\u ACTION\u BAR)=Window.FEATURE\u ACTION\u BAR
并没有真正的单符号(&)用法,但正如我前面所说的,您可以在任何活动上尝试此OnMenuOpen覆盖,即使没有第一个检查功能是否存在的if()(您仍然可以检查菜单!=当然为null),并查看在您的情况下,跨设备/SDK的行为是否可取。+谢谢!我使用了您的代码,但将featureId==Window.FEATURE\u ACTION\u BAR替换为(featureId&Window.FEATURE\u ACTION\u BAR)==Window.FEATURE\u ACTION\u BAR.@leRobot:解释了符号是如何工作的以及为什么工作的,一旦你读到它,你就会同意这里的用法非常聪明:)这只是使它作为一个动作项出现在实际的栏上(而不是菜单中)。这是我需要做的。谢谢。这是唯一真正可行的解决方案,但你需要添加@SuppressLint(“RestrictedApi”)
严肃地说,伙计们,这是唯一真正可行的解决方案。是的,别忘了在方法public boolean oncreateoptions Menu(Menu Menu)上加上@SuppressLint(“RestrictedApi”)太好了!兄弟,你真的节省了我的时间。现在,至少对Android kotlin来说,方法名似乎是setForceShowIcon()。
/* menu code */
<?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:id="@+id/one" android:title="one"
android:icon="@mipmap/ic_launcher" app:showAsAction="always" />
<item android:id="@+id/two" android:title="two"
android:icon="@mipmap/ic_launcher" app:showAsAction="always" />
<item android:id="@+id/three" android:title="three"
android:icon="@mipmap/ic_launcher" />
</menu>
/* Java code */
@SuppressLint("RestrictedApi")
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.mymenu,menu);
if(menu instanceof MenuBuilder){
MenuBuilder m = (MenuBuilder) menu;
m.setOptionalIconsVisible(true);
}
return true;
}
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if(menu != null){
if(menu.getClass().getSimpleName().equals("MenuBuilder")){
try{
Method m = menu.getClass().getDeclaredMethod(
"setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
}
catch(NoSuchMethodException e){
Log.e("MAIN", "onMenuOpened", e);
}
catch(Exception e){
throw new RuntimeException(e);
}
}
}
return super.onMenuOpened(featureId, menu);
}
app:showAsAction="always
if (item.getItemId() == R.id.print) {
item.setIcon(getDrawable(R.drawable.print));