Ответ 1
Если вы используете свой код на Android 3.0+, значки в меню не отображаются по дизайну. Это дизайнерское решение от Google.
Подробнее об этом можно узнать в этом в блоге разработчиков Android.
Я хочу добавить обработчик меню в свой проект. Я читал http://developer.android.com/guide/topics/ui/menus.html, это очень просто, но значок не отображается. Я очень смущен. Я даже добавил пункт меню программно.
Мой код:
@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+, значки в меню не отображаются по дизайну. Это дизайнерское решение от Google.
Подробнее об этом можно узнать в этом в блоге разработчиков Android.
После длинной попытки я нашел ниже решение, которое могло бы помочь другим экономить там время. В принципе, решение, предоставляемое "lbarbosa", мне нравится искренне благодарить его.
Пробовал это на основе предыдущих ответов, и он отлично работает, по крайней мере, с более поздними версиями библиотеки поддержки (25.1):
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
if(menu instanceof MenuBuilder){
MenuBuilder m = (MenuBuilder) menu;
m.setOptionalIconsVisible(true);
}
return true;
}
Независимо от того, какие варианты дизайна, сделанные системой, вы можете обойти это с помощью решения, представленного в верхнем ответе на этот вопрос
Код ниже для полноты. Протестировано на 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);
}
Старый вопрос, но надеюсь, что это поможет кому-то.
используйте следующий код:
<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>
note Я использовал app:showAsAction
вместо android:showAsAction
Вы можете добавить в свой XML файл атрибут android:showAsAction="always"
внутри элемента элемента. Затем он отобразит соответствующий пункт меню в виде значка внутри панели действий.
Обратите внимание, что это будет вместо текста в меню.
Для дальнейшего чтения посмотрите здесь под андроид: showAsAction.
Забудьте все, сделайте этот шаг.
добавьте app:showsAsAction="always"
к вашему элементу. Если вы используете android:showsAsAction="always"
, вы не получите решение.
Попробуйте добавить атрибут app к вашему элементу.
/* 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;
}
Работа с android.support.v7.app.AppCompatActivity
делает ввод значков очень сложной задачей. Вам нужно реализовать onMenuOpen
, супер метод из класса AppComactActivity
. После этого проверьте, не является ли меню пустым. Если меню не является нулевым, передайте класс Method, как этот, и setOptionalIconsVisible
в 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);
}
Просто добавьте этот атрибут в тег item в вашем menu.xml
Приложение: showAsAction = "всегда
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 0, 0, "androidDemo").setIcon(R.drawable.ic_launcher);
getMenuInflater().inflate(R.layout.menu, menu);
return true;
}
и в xml:
<item android:id="@+id/menuUpdate"
android:icon="@drawable/update_icon"
android:title="@string/Update"
android:showAsAction="always"/>