Пункт меню Android 4.3 showAsAction = "always" игнорируется

Я использую новую библиотеку appcompat v7, доступную начиная с Android 4.3 (API уровня 18).

Независимо от того, что указано в showAsAction для элемента меню, оно не отображается - оно всегда создает значок меню переполнения и помещает в меню только один пункт меню.

Попытка добавить меню к такому действию:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_sizes, menu);
    return true;
}

И вот мое меню xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

Является ли это ошибкой новой библиотеки поддержки v7 или что-то не так с кодом? Я уже много раз использовал аналогичный код с ActionBarSherlock.

Ответ 1

Возможно, вам не хватает требуемого пространства имен:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:[yourapp]="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        [yourapp]:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

Замените [yourapp] вашим именем приложения или любым пространством имен, которое ваше сердце желает повсюду.

Другие вещи, которые стоит проверить:

  • Посмотрите, расширяет ли ваш класс активности ActionBarActivity

Проверьте, сохраняется ли проблема.


Справочная документация для Android: Добавление кнопок действий. Вот соответствующий текст:

Если ваше приложение использует библиотеку поддержки для совместимости в версиях с Android 2.1, атрибут showAsAction недоступен из пространства имен android:. Вместо этого этот атрибут предоставляется библиотекой поддержки, и вы должны определить собственное пространство имен XML и использовать это пространство имен в качестве префикса атрибута. (Пользовательское пространство имен XML должно быть основано на имени вашего приложения, но оно может быть любым именем, которое вы хотите, и доступно только в пределах объема файла, в котором вы его объявляете.)

Ответ 2

Подумал сам. С помощью библиотеки поддержки v7 showAsAction следует перейти в пользовательское пространство имен, подобное этому:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:balloonberry="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        balloonberry:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

Ответ 3

Также убедитесь, что вы используете правильный надувной элемент в методе ActionBarActivity.onCreateOptionsMenu().

Правильное решение:

MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_example, menu);

Неправильное решение:

MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu_example, menu);

Ответ 4

Для Фрагменты

Меню с пользовательским пространством имен будет показано предотвратить showAsAction.

Использование префикса "android:" для showAsAction будет работать, хотя Android Studio замечает, что вы должны использовать собственное пространство имен.

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_add_checkin"
          android:title="Add Checkin"
          android:orderInCategory="10"
          android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add"/>
</menu>

Это использует фрагменты Android SDK 22 и Support v4, если это имеет значение.

Ответ 5

У вас такая же проблема, но на Android 5. У меня есть 3 элемента, но ОС игнорирует мой атрибут "всегда" и показывает только 2 элемента. Здесь мое решение:

  @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(TAG, "onCreateOptionsMenu()");
    inflater.inflate(R.menu.your_menu, menu);
    for (int j = 0; j < menu.size(); j++) {
        MenuItem item = menu.getItem(j);
        Log.d(TAG, "set flag for " + item.getTitle());
        item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
    }
}

Ответ 6

Также убедитесь, что у вас есть правильный путь для пространства имен. Это не даст вам сообщение об ошибке, если оно неверно.

У меня был

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

вместо

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

Все, что я знал, это то, что он не работает. Не знаю, как мне удалось забыть часть /apk пути, но это произошло. Нет сообщения об ошибке, просто неуловимая ошибка для отслеживания.

Ответ 7

В моем случае мне пришлось удалить из моего приложения build.gradle компилировать 'com.android.support:appcompat-v7:21.0.3'.

Уведомление: Мой min sdk = 14, и созданный проект студией Android установил мою неосязаемую зависимость.

После этой замены вы можете написать  андроид: showAsAction = "всегда"

Ответ 8

Это может быть не ваше дело, но я использовал

new MenuInflater(this).inflate(R.menu.my_menu, menu);

изменив его на

getMenuInflater().inflate(R.menu.my_menu, menu);

исправлена ​​проблема!

Ответ 9

Имел ту же проблему.

У меня был

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item 
    android:id="@+id/searchRunner"
    android:icon="@drawable/ic_home_black"
    android:title="Search"
    android="ifRoom"/></menu>

вместо

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item 
    android:id="@+id/item1"
    android:title="Options"/>
<item 
    android:id="@+id/searchRunner"
    android:icon="@drawable/ic_home_black"
    android:title="Search"
    app:showAsAction="ifRoom"/></menu>

Ответ 10

<?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/back"
        android:icon="@drawable/back"
        app:showAsAction="always"
        android:title="@string/back"/>
    <item
        android:id="@id/save"
        android:icon="@drawable/le_top_btn_icon_add"
        app:showAsAction="ifRoom"
        android:title="@string/save"/>
</menu>

не работают,  с поддержкойLibraryVersion = '25.1.0 ' compileSdkVersion = 25

см. "Предупреждение"

Должно использовать приложение: showAsAction с библиотекой appcompat с xmlns: app = "http://schemas.android.com/apk/res-auto" меньше... (Ctrl + F1)

При использовании библиотеки appcompat ресурсы меню должны ссылаться на showAsAction в пространстве имен приложений: не андроид: пространство имен.

Аналогично, если не использовать библиотеку appcompat, вы должны использовать атрибут android: showAsAction.

Я думаю, что предупреждение можно игнорировать.

Ответ 11

добавьте собственное пространство имен, подобное этому, чтобы показатьAsAction и actionViewClass:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
    android:title="@string/search"
    android:icon="@drawable/ic_search"
    app:showAsAction="collapseActionView|ifRoom"
    app:actionViewClass="android.widget.SearchView" />

Ответ 12

Самый простой способ:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/history"
        android:icon="@drawable/icons8_history_white_medium"
        android:title="History"
        myapp:showAsAction="always" />
    <item
        android:id="@+id/synchrnonize"
        android:icon="@drawable/icons8_synchronize_white_medium"
        android:title="Synchronize"
        myapp:showAsAction="always" />
</menu>

Ответ 13

Я решил это, заменив

android:showAsAction="ifRoom"

с

app:showAsAction="ifRoom"

Это выглядит как xmlitme xml,

<item android:id="@+id/action_refresh"
      android:title="Refresh"
      android:icon="@drawable/refresh2"
      app:showAsAction="ifRoom" />

Ответ 14

Самый простой способ - изменить ваш код, добавив

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

и измени этот код

android:showAsAction="always"

в

app:showAsAction="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_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        app:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>