it-swarm.com.ru

Элемент меню Android 4.3 showAsAction = "всегда" игнорируется

Я использую новую доступную библиотеку приложений 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 много раз раньше.

113
Mcingwe

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

<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 должно основываться на имени вашего приложения, но это может быть любое имя, которое вы хотите, и оно доступно только в пределах файла, в котором вы его объявляете.) 

308
Nikola Despotoski

Сам разобрался. С библиотекой поддержки 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>
52
Mcingwe

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

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

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

Неверное решение:

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

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

Меню с настраиваемым пространством имен будутпрепятствовать отображению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, на случай, если что-то изменится.

23
Baker

У меня та же проблема, но на 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);
    }
}
16
Lukas

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

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

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

6
Anton Kizema

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

Я имел

<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, но это случилось. Нет сообщения об ошибке, просто неуловимая ошибка, чтобы выследить.

6
BeccaP

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

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

меняя его на 

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

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

4
Bakhshi

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

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>
0
Abdulhakim Zeinu

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

Android:showAsAction="ifRoom"

с 

app:showAsAction="ifRoom"

Это menuitme XML выглядит так,

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

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

<?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>
0
Paweł

добавьте пользовательское пространство имен, например, в showAsAction и 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" />

0
Amirouche Zeggagh
<?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>

не работает, with supportLibraryVersion = '25 .1.0 ' compileSdkVersion = 25 

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

Следует использовать app: showAsAction с библиотекой appcompat с Xmlns: app = "http://schemas.Android.com/apk/res-auto" less ... (Ctrl + F1) 

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

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

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

0
Bill