2013-11-03 2 views
27

Я хочу добавить обработчик меню в свой проект. Я тоже читал http://developer.android.com/guide/topics/ui/menus.html, его очень просто, но значок не отображается. Я очень смущен. Я даже добавил пункт меню программно.значок в меню, не отображающемся в 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 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> 
+0

который андроид версия устройство работает? – Hardik

+0

4.1.2, но я запускаю http: //www.androidhive.info/2011/09/how-to-create-android-menus/и его отлично работающий –

+1

это определенно одна из самых неприятных проблем с Android. Я понятия не имею, почему это не работает. Их документация делает именно то, что вы делаете, но это не работает. –

ответ

29

Если вы используете свой код на Android 3.0+, иконки в меню не показаны конструкции. Это дизайнерское решение от Google.

Подробнее об этом можно узнать в this на блоге разработчиков Android.

+0

, но я запускаю http://www.androidhive.info/2011/09/how-to-create-android-menus/ и его работу, –

+0

Ваша деятельность расширяет «ActionBarActivity», когда она не работает? – Szymon

+0

no, extend activity –

6

Вы можете добавить в свой XML-файл атрибут android:showAsAction="always" внутри элемента элемента. Затем он отобразит соответствующий пункт меню в виде значка внутри панели действий.

Обратите внимание: в меню будет текста.

Для дальнейшего ознакомления, посмотрите here под android: showAsAction.

27

Независимо от того, какого дизайна выбора, где сделанной системой, вы можете обойти это с решением, представленным в the top upvoted answer to this question

ниже кода для полноты картины. Опробованную работает на 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); 
} 
+1

Это ALMOST работало для меня. По причинам, которые я не понимаю, значение featureId для меня было 0. Я заменил первый оператор if "if (featureId == Window.FEATURE_OPTIONS_PANEL && menu! = Null) {" и он сработал. Хотя, я не уверен, что «FEATURE_OPTION_PANEL» является правильным значением 0, которое получает мое приложение. –

+0

Ну, большинство обходных решений Java для вредоносных встроенных «лучших практик» Android (a.k.a. вытащить Apple из API-интерфейса разработчика) полагаются либо на Java-отражение, либо на источник copypasta с исходным кодом для проекта (что гораздо менее привлекательно, но безопаснее). Дело в том, что, используя прежние люди, чувствуется необходимость переоценить изменения. В этом случае было решено, что настройки были специфичными для вызовов ActionBar, но могут быть и другие допустимые, например ваши, в зависимости от уровня API и whatnot – leRobot

+0

Большое вам спасибо за это! –

-1
@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"/> 

2

Забудьте все те, сделать этот шаг. добавить app:showsAsAction="always" к вашему изделию. Если вы используете android:showsAsAction="always", вы не получите решение. Попробуйте добавить атрибут app к вашему элементу.

+0

Это просто заставляет его отображаться на фактической панели (не в меню) в качестве элемента действия. – Fattie

18

Старый вопрос, но надеюсь, что это поможет кому-то.

использовать следующий код:

<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

+0

Это мне нужно. Спасибо. – hellaandrew

12

После долгих попыток я нашел ниже решения, которое могло бы помочь другим, чтобы сохранить там время. В принципе, решение, предоставляемое «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; 
} 
Смежные вопросы