Пункты меню не отображаются на панели действий

Я использую appcompat в своем приложении. Я хочу, чтобы элементы меню отображались на панели действий или, по крайней мере, в переполнении (3 точки), чтобы показывать их, когда нет места. На панели действий много места, но они все равно не отображаются. Поток меню поднимается снизу, и это тоже только при нажатии кнопки меню.

menu_activity.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/menu_lang"
        android:showAsAction="always"
        android:title="@string/menu_lang"
        android:icon="@android:drawable/ic_input_lang"/>

</menu>

активность:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_activity, menu);
        return true;
    }

В этом сообщении говорится, что оно не работает, когда присутствует аппаратная кнопка меню. Но другие приложения могут отображать элементы на том же устройстве. Итак, этот ответ кажется неверным. Может ли кто-нибудь помочь в этом?

введите здесь описание изображения


person rick    schedule 22.08.2013    source источник
comment
Итак, в основном вы хотите открыть меню панели действий при нажатии кнопки аппаратного меню (если есть) \?   -  person Prateek    schedule 22.08.2013
comment
покажи нам все свое меню xml   -  person M.Bennett    schedule 22.08.2013
comment
@prateek Нет. Я хочу, чтобы элементы отображались на панели действий, как показано на рисунке выше. Как видите, справа есть два варианта поиска и добавления. Итак, я хочу, чтобы они были видны на панели действий. Но они появляются вверх вниз на экран только при нажатии кнопки меню.   -  person rick    schedule 22.08.2013
comment
@ M.Bennett Это все мое меню.xml. У меня только вариант. Поэтому я хочу, чтобы он отображался на панели действий.   -  person rick    schedule 22.08.2013
comment
@ М.Беннетт, я пытался. бесполезно :/   -  person rick    schedule 22.08.2013
comment
Вы сталкиваетесь с этой проблемой во всех версиях Android или только в версии 4.x?   -  person    schedule 22.08.2013
comment
@mANDROID Даже на 2.2 тоже. Я не понимаю, почему он не показывает элементы на панели действий, хотя на ней много места, и даже точки переполнения не видны. Он просто отображается снизу только с заголовком, когда нажата кнопка меню.   -  person rick    schedule 22.08.2013
comment
О, хорошо, потому что я столкнулся с несколькими проблемами во время тестирования на Android 4.x, о которых я упоминал в этом вопросе и ответ. Тем не менее я посмотрю, смогу ли я найти решение для вас.   -  person    schedule 22.08.2013
comment
Проверьте мой ответ, который я только что опубликовал, и дайте мне знать, работает ли он для вас.   -  person    schedule 22.08.2013
comment
@ Роберт П. и все, если вы проверите дату заданного вопроса, то это будет позже, чем когда я задал этот вопрос. Итак, я просто хочу знать, как мой вопрос может быть продублирован?   -  person rick    schedule 28.02.2014
comment
@rick, как ты восстановился, я тоже столкнулся с тем же   -  person Erum    schedule 04.02.2015


Ответы (3)


Похоже, вы используете неправильное меню: ваш файл называется «menu_activity.xml», и вы расширяете меню с идентификатором ресурса: R.menu.reminder_menu

Имя ресурса меню должно совпадать с именем файла, то есть: R.menu.manu_activity

Попробуйте еще раз с этим - я тоже однажды столкнулся с этим, и это сводило меня с ума...

Обновление После уточнения того, что приведенная выше часть была предназначена для запутывания, убедитесь, что:

  1. Вы расширяете ActionBarActivity.
  2. Вы используете (или расширяете) одну из тем Theme.AppCompat для действия (или всего приложения)
  3. Поскольку на старых устройствах атрибуты, связанные с панелью действий, отсутствуют, убедитесь, что все эти атрибуты в XML используются с настраиваемым пространством имен. Здесь это будет атрибут showAsAction, чтобы библиотека совместимости могла их подобрать.

У вас уже было определено пользовательское пространство имен («приложение» в теге меню). Вам нужно изменить тег android:showAsAction на app:showAsAction в соответствии с руководством по Android.

Ваш исправленный файл menu_activity.xml будет выглядеть следующим образом:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/menu_lang"
        app:showAsAction="always"
        android:title="@string/menu_lang"
        android:icon="@android:drawable/ic_input_lang"/>

</menu>

расширенное руководство Android по панели действий охватывает эти новые неприятные ловушки...

person Patrick    schedule 22.08.2013
comment
Я забыл изменить имя при публикации вопроса для сохранения анонимности. Но это не совсем ответ на мой вопрос. Простите за это. - person rick; 22.08.2013
comment
Без проблем. Если вы используете AppCompat от Google, также убедитесь, что вы расширяете ActionBarActivity :) - person Patrick; 22.08.2013
comment
Спасибо за Ваш ответ. Я сделал это. Я могу найти варианты, только когда я нажимаю кнопку меню. Но не на панели действий. Я хочу, чтобы элементы отображались на панели действий, как показано на рисунке выше. - person rick; 22.08.2013
comment
Обновлено с дополнительной информацией: особенно проверьте, что вы используете префикс app, который вы определили для атрибута showAsAction! - person Patrick; 23.08.2013
comment
Я не совсем понимаю 3-й пункт. Не могли бы вы уточнить? - person rick; 23.08.2013
comment
Конечно, я добавил исправленную версию XML и расширенное объяснение. - person Patrick; 23.08.2013
comment
Большое спасибо. Я решил это из этого поста несколько часов назад. stackoverflow.com/questions/18386642/ Ваш ответ также объясняет то же самое. Я пропустил пространство имен yourapp для showAsAction. Вместо этого я сохранил андроид: - person rick; 23.08.2013
comment
Рад помочь - даже с опозданием на несколько часов ;) - person Patrick; 23.08.2013
comment
давайте продолжим обсуждение в чате - person rick; 23.08.2013
comment
@Rat-a-tat-a-tatRatatouille, можешь рассказать мне, как ты решил, что это не решает мою проблему? - person Erum; 04.02.2015

Хорошо, я думаю, что нашел решение для вас. Это называется меню переполнения, и вам нужно вызвать метод ниже в вашем методе onCreate.

private void getOverflowMenu() {

try {
   ViewConfiguration config = ViewConfiguration.get(this);
   Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
   if(menuKeyField != null) {
       menuKeyField.setAccessible(true);
       menuKeyField.setBoolean(config, false);
   }
} catch (Exception e) {
   e.printStackTrace();
}
}

Попробуйте это и дайте мне знать, если это работает для вас.

ИЗМЕНИТЬ:

Кажется, я наконец понял вашу проблему. Я могу дать вам одну идею. Если вы не хотите использовать дополнительное меню и просто отображать элементы меню, как показано на опубликованном вами снимке экрана, вы можете создать макет поверх своей активности.

Вы можете взять линейный макет, задать фон, который выглядит так же, как панель действий, и разместить любые значки, которые вы хотите поместить туда, и придать им функциональность с помощью onClickListener. Надеюсь, это даст вам некоторое представление. Таким образом, вы можете создать свое собственное меню. Попробуйте макет ниже и замените рисуемый ic_launcher значками меню. Затем просто установите для них onClickListeners и выполняйте любые функции, которые вы хотите выполнять внутри метода onClick.

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="#66000000" >

    <ImageView
        android:id="@+id/xMenuBtn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:background="@drawable/ic_launcher" />
     <TextView
        android:id="@+id/xMenuTxt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Chats"
        android:textSize="18sp"
        android:layout_toRightOf="@+id/xMenuBtn1"
        android:layout_centerVertical="true" />
    <ImageView
        android:id="@+id/xMenuBtn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/xMenuBtn3"
        android:background="@drawable/ic_launcher" />
    <ImageView
        android:id="@+id/xMenuBtn3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:background="@drawable/ic_launcher" />

</RelativeLayout>
person Community    schedule 22.08.2013
comment
+1 Большое спасибо за ответ. Он показывает по крайней мере меню переполнения и лучше, чем раньше. Но почему пункт меню не отображается на панели действий? Потому что места много. Есть ли что-нибудь подобное, что мне нужно сделать, чтобы показать это на панели действий? - person rick; 23.08.2013
comment
Хорошо, вам нужны эти кнопки меню вместе с дополнительным меню? или вы просто хотите отобразить все пункты меню так, как они показаны на снимке экрана, который вы отобразили? - person ; 23.08.2013
comment
Пожалуйста, проверьте часть EDIT в моем ответе, надеюсь, вы получите представление о том, как это сделать. - person ; 23.08.2013

Попробуйте в своей деятельности onCreate() :

ActionBar bar = getSupportActionBar();
bar.setTitle(R.string.app_name);

а потом :

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {    
        menu.clear();
        getSupportMenuInflater().inflate(R.menu.menu_activity, menu);
        return super.onPrepareOptionsMenu(menu);
    }
person An-droid    schedule 22.08.2013
comment
Не могли бы вы внимательно прочитать мой вопрос? Потому что я использую appcompat - person rick; 22.08.2013
comment
поддержка v7 включает v4 я не прав? Это должно работать. Кстати, почему бы не использовать АБС? - person An-droid; 22.08.2013
comment
Потому что я думал, что Google предоставил одну вместо сторонней библиотеки. - person rick; 22.08.2013
comment
Панель действий Sherlock основана на поддержке библиотеки v4 и панели действий. Это самая стабильная/портативная библиотека. Вы, конечно, не сделаете лучше (или это займет у вас много времени, пустая трата времени) и с этой jgilfelt.github.io/ android-actionbarstylegenerator/ вы сразу получаете красивую панель действий;) - person An-droid; 22.08.2013
comment
@ Yume117 ActionBarSherlock больше не поддерживается; Джейк Уортон (автор) ясно заявил, что собирается убедиться, что это работает, но никаких новых функций добавляться не будет. Он предлагает, чтобы все использовали (по возможности) ActionBarCompat (та же идея, выпущенная Google) по очевидным причинам. На момент написания этого вопроса ActionBarCompat уже был выпущен, поэтому в ОП четко сказано: вместо использования сторонней библиотеки. - person Martin Marconcini; 23.01.2014
comment
Хорошая информация, можете ли вы предоставить ссылку, которая перенаправит нас, где вы нашли информацию? - person An-droid; 23.01.2014
comment
@Yume117 вот ссылка на его запись в блоге - person Andrew T.; 19.02.2014