Android 工具栏弹出菜单不显示图标
Android Toolbar Popup menu not showing icons
我正在尝试为我的工具栏显示一个下拉菜单,其中包括文本和图标:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_add"
android:title="@string/menu.add"
android:icon="@drawable/ic_add_black_24dp"
app:showAsAction="always" />
<item
android:id="@+id/menu_edit"
android:title="@string/menu.edit"
android:icon="@drawable/ic_create_black_24dp"
app:showAsAction="never" />
</menu>
menu_add 确实在工具栏本身上显示了图标,但 menu_edit 只显示了没有图标的文本。
此答案: 说 Google 已设计删除它,但并未提及您可以如何覆盖它。
编辑
我还需要设备 "menu" 按钮来显示相同的菜单。
是的,它不会在新版本的支持库中显示,但您可以通过添加子菜单来解决这个问题。 (您可以通过 xml 和代码添加它)。
像这样:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_settings"
android:icon="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"
android:title="@string/action_settings"
app:showAsAction="always">
<menu>
<item
android:icon="@drawable/ic_event"
android:title="@string/action_settings"
app:showAsAction="always" />
<item
android:icon="@drawable/ic_event"
android:title="@string/action_settings"
app:showAsAction="always" />
</menu>
</item>
</menu>
希望对您有所帮助:)
编辑:查看以上代码的快照:
=>
我找到了这个解决方案:。基本上,重写方法不会破坏设备菜单按钮或溢出。
感谢大家。
它不适用于 android 支持的 v7 版本,但您可以通过稍微修改来调整它。下面的代码对我有用
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/action_settings"
android:icon="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"
android:title="@string/action_settings"
app:showAsAction="always">
<menu>
<item
android:id="@+id/action_rate"
android:icon="@drawable/ic_grade_black_24dp"
android:orderInCategory="100"
android:title="@string/action_rate"
app:showAsAction="never" />
<item
android:id="@+id/action_share"
android:icon="@drawable/ic_share_black_24dp"
android:orderInCategory="101"
android:title="@string/action_share"
app:showAsAction="never" />
<item
android:id="@+id/action_enquiry"
android:icon="@drawable/ic_message_black_24dp"
android:orderInCategory="102"
android:title="@string/action_enquiry"
app:showAsAction="never" />
<item
android:id="@+id/action_disclaimer"
android:icon="@drawable/ic_info_black_24dp"
android:orderInCategory="103"
android:title="@string/action_disclaimer"
app:showAsAction="never" />
</menu>
</item>
试试这个
MenuPopupHelper menuHelper = new MenuPopupHelper(getContext(), (MenuBuilder)
popupmenu.getMenu(), button);
menuHelper.setForceShowIcon(true);
menuHelper.show();
对我有用。
我创建了这样的东西:
@SuppressLint("RestrictedApi")
fun Menu.showIcons() {
(this as? MenuBuilder)?.setOptionalIconsVisible(true)
}
它基本上适用于任何菜单。
对于工具栏,您可以覆盖 activity 或片段中的 onPrepareOptionsMenu
,然后在调用 super
之前调用 menu.showIcons()
或者您可以将其与 PopupMenu
一起使用像这样 PopupMenu(requireContext(), anchor).menu.showIcons()
.
我创建了这样的东西:
试试这个:
Menu menu= toolbar.getMenu();
Method menuMethod = null;
try {
menuMethod = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
menuMethod.setAccessible(true);
menuMethod.invoke(menu, true);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
从 Above 3.0 android 弹出菜单中的图标不显示所以你必须欺骗它,这个可以试试
//init the popup
PopupMenu popup = new PopupMenu(context, anchor);
/* The below code in try catch is responsible to display icons*/
try {
Field[] fields = popup.getClass().getDeclaredFields();
for (Field field : fields) {
if ("mPopup".equals(field.getName())) {
field.setAccessible(true);
Object menuPopupHelper = field.get(popup);
Class<?> classPopupHelper = Class.forName(menuPopupHelper.getClass().getName());
Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class);
setForceIcons.invoke(menuPopupHelper, true);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
//inflate menu
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
//show menu
popup.show();
这段 Kotlin 代码对我有用。
我用了 "popup.setForceShowIcon(true)"
val popup = PopupMenu(上下文, 按钮);
popup.menuInflater.inflate(menuRes, popup.menu);
popup.setForceShowIcon(真)
完整代码写在下面
//R.menu.menu_popup -- Menu xml File
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_1"
android:icon="@drawable/email"
android:title="Email" />
<item android:id="@+id/menu_2"
android:icon="@drawable/phone"
android:title="Phone" />
</menu>
// Inside Activity
findViewById<Button>(R.id.button1).setOnClickListener {
show_PopUp_Menu(this, it, R.menu.menu_popup)
}
@SuppressLint("RestrictedApi")
fun show_PopUp_Menu(context: Context, button:Button, menuRes: Int) {
val popup = PopupMenu(context, button)
popup.menuInflater.inflate(menuRes, popup.menu)
popup.setOnMenuItemClickListener { menuItem: MenuItem ->
when(menuItem.itemId){
R.id.menu_1->{
Toast.makeText(this, "Menu 1 clicked", Toast.LENGTH_SHORT).show()
true
}
R.id.menu_2->{
Toast.makeText(this, "Menu 2 clicked", Toast.LENGTH_SHORT).show()
true
}
else -> false
}
}
popup.setOnDismissListener {
// Respond to popup being dismissed.
}
popup.setForceShowIcon(true)
popup.show()
}
我正在尝试为我的工具栏显示一个下拉菜单,其中包括文本和图标:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_add"
android:title="@string/menu.add"
android:icon="@drawable/ic_add_black_24dp"
app:showAsAction="always" />
<item
android:id="@+id/menu_edit"
android:title="@string/menu.edit"
android:icon="@drawable/ic_create_black_24dp"
app:showAsAction="never" />
</menu>
menu_add 确实在工具栏本身上显示了图标,但 menu_edit 只显示了没有图标的文本。
此答案: 说 Google 已设计删除它,但并未提及您可以如何覆盖它。
编辑
我还需要设备 "menu" 按钮来显示相同的菜单。
是的,它不会在新版本的支持库中显示,但您可以通过添加子菜单来解决这个问题。 (您可以通过 xml 和代码添加它)。 像这样:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_settings"
android:icon="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"
android:title="@string/action_settings"
app:showAsAction="always">
<menu>
<item
android:icon="@drawable/ic_event"
android:title="@string/action_settings"
app:showAsAction="always" />
<item
android:icon="@drawable/ic_event"
android:title="@string/action_settings"
app:showAsAction="always" />
</menu>
</item>
</menu>
希望对您有所帮助:) 编辑:查看以上代码的快照:
我找到了这个解决方案:
它不适用于 android 支持的 v7 版本,但您可以通过稍微修改来调整它。下面的代码对我有用
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/action_settings"
android:icon="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"
android:title="@string/action_settings"
app:showAsAction="always">
<menu>
<item
android:id="@+id/action_rate"
android:icon="@drawable/ic_grade_black_24dp"
android:orderInCategory="100"
android:title="@string/action_rate"
app:showAsAction="never" />
<item
android:id="@+id/action_share"
android:icon="@drawable/ic_share_black_24dp"
android:orderInCategory="101"
android:title="@string/action_share"
app:showAsAction="never" />
<item
android:id="@+id/action_enquiry"
android:icon="@drawable/ic_message_black_24dp"
android:orderInCategory="102"
android:title="@string/action_enquiry"
app:showAsAction="never" />
<item
android:id="@+id/action_disclaimer"
android:icon="@drawable/ic_info_black_24dp"
android:orderInCategory="103"
android:title="@string/action_disclaimer"
app:showAsAction="never" />
</menu>
</item>
试试这个
MenuPopupHelper menuHelper = new MenuPopupHelper(getContext(), (MenuBuilder)
popupmenu.getMenu(), button);
menuHelper.setForceShowIcon(true);
menuHelper.show();
对我有用。
我创建了这样的东西:
@SuppressLint("RestrictedApi")
fun Menu.showIcons() {
(this as? MenuBuilder)?.setOptionalIconsVisible(true)
}
它基本上适用于任何菜单。
对于工具栏,您可以覆盖 activity 或片段中的 onPrepareOptionsMenu
,然后在调用 super
之前调用 menu.showIcons()
或者您可以将其与 PopupMenu
一起使用像这样 PopupMenu(requireContext(), anchor).menu.showIcons()
.
我创建了这样的东西: 试试这个:
Menu menu= toolbar.getMenu();
Method menuMethod = null;
try {
menuMethod = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
menuMethod.setAccessible(true);
menuMethod.invoke(menu, true);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
从 Above 3.0 android 弹出菜单中的图标不显示所以你必须欺骗它,这个可以试试
//init the popup
PopupMenu popup = new PopupMenu(context, anchor);
/* The below code in try catch is responsible to display icons*/
try {
Field[] fields = popup.getClass().getDeclaredFields();
for (Field field : fields) {
if ("mPopup".equals(field.getName())) {
field.setAccessible(true);
Object menuPopupHelper = field.get(popup);
Class<?> classPopupHelper = Class.forName(menuPopupHelper.getClass().getName());
Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class);
setForceIcons.invoke(menuPopupHelper, true);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
//inflate menu
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
//show menu
popup.show();
这段 Kotlin 代码对我有用。 我用了 "popup.setForceShowIcon(true)"
val popup = PopupMenu(上下文, 按钮);
popup.menuInflater.inflate(menuRes, popup.menu);
popup.setForceShowIcon(真)
完整代码写在下面
//R.menu.menu_popup -- Menu xml File
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_1"
android:icon="@drawable/email"
android:title="Email" />
<item android:id="@+id/menu_2"
android:icon="@drawable/phone"
android:title="Phone" />
</menu>
// Inside Activity
findViewById<Button>(R.id.button1).setOnClickListener {
show_PopUp_Menu(this, it, R.menu.menu_popup)
}
@SuppressLint("RestrictedApi")
fun show_PopUp_Menu(context: Context, button:Button, menuRes: Int) {
val popup = PopupMenu(context, button)
popup.menuInflater.inflate(menuRes, popup.menu)
popup.setOnMenuItemClickListener { menuItem: MenuItem ->
when(menuItem.itemId){
R.id.menu_1->{
Toast.makeText(this, "Menu 1 clicked", Toast.LENGTH_SHORT).show()
true
}
R.id.menu_2->{
Toast.makeText(this, "Menu 2 clicked", Toast.LENGTH_SHORT).show()
true
}
else -> false
}
}
popup.setOnDismissListener {
// Respond to popup being dismissed.
}
popup.setForceShowIcon(true)
popup.show()
}