Пункт меню Android 4.3 showAsAction = "завжди" ігнорується


116

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

Незалежно від того, що вказано в 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.


2
В інформаційних цілях - "... "always"не рекомендується; краще використовувати "ifRoom"та дозволити ОС вирішити".
ChiefTwoPencils

Відповіді:


313

Можливо, вам не вистачає необхідного простору імен:

<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
Це я і дізнався. Дякую - напевно прийняли. Але showAsAction повинен використовувати цей користувальницький простір імен.
Mcingwe

5
'yourapp' означає в String.xml <string name = "app_name"> yourapp </string> так?
LOG_TAG

4
Хтось може пояснити, ЧОМУ це працює? Чому виникає потреба розширити власну область імен? Трохи розгублений.
dineth

8
@dineth appcompat використовується як бібліотечний проект. Це означає, що всі його ресурси (рядки, графічні, атрибути ...) задекларовані у вашому просторі імен додатків замість простору імен Android. Оскільки showAsActionатрибута не було в android-7, ви повинні використовувати простір імен додатків
nicopico

22
Усі говорять про "власну область імен" або "простір імен, що відповідає вашому додатку". Але простір імен завжди є http://schemas.android.com/apk/res-autoв кожному прикладі. Це не призначений для користувача або той, що відповідає вашому додатку. Це власне простір імен з документації. Я думаю, що кожен означає власну приставку , і насправді це може бути все, що завгодно. Це правда?
Ендрю Арнотт

52

Зрозумів сам. За допомогою бібліотеки підтримки 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>

1
'balloonberry' означає в String.xml "<string name =" app_name "> balloonberry </string>" правда?
LOG_TAG

5
@LOG_TAG - ні, це має бути просто так, як зазначено вище. Це не рядок, а простір імен.
BeccaP

ohhh підтримка v7 помилка ... його нормально щодо підтримки v4
Yasitha Waduge

Дякуємо за пояснення Mcingwe
Sachidananda Naik

32

Також переконайтеся, що ви використовуєте правильний надувний пристрій в ActionBarActivity.onCreateOptionsMenu ().

Правильне рішення:

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

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

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

1
Я передав усі вищенаведені відповіді та ще одну відповідь на stackoverflow, але єдине, чого мені не вистачало, це ти відповідь - getMenuInflater (). Дякуємо, що поділилися цим.
Amt87

Дякую ТАКІ МНОГО за це. Я перетворив всі свої 100+ меню для використання користувальницького простору імен, а 1 екраніст вону все ще не працював ... виявляється, що 1 діяльність використовувала "новий MenuInflater" замість getMenuInflater (). Дякую тонну!
DiscDev

це дуже важливо. Я використовував створення менюInflater (2 способи). Спасибі
wtk

24

Для фрагментів

Меню з користувацьким простором імен не дозволять показувати 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, наскільки це має значення.


Це єдине, що вирішило Мою проблему (хоча вона показує цю помилку). Дякую !
користувач2630165

3
Ви можете придушити помилку / попередження в макеті XML за допомогою інструментів: ignore = "AppCompatResource" в <item>. Документи тут: tools.android.com/tips/lint/suppressing-lint-warnings
Бейкер

Ваша відповідь та питання Антона Кіземи - це правильне рішення для мене. А також дякую за пораду tools:ignore.
хата

16

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

1
setShowAsActionFlags()вимагає API 14, але це все ж було найкращим рішенням для мене.
Містер Бангл,

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 частину шляху, але це сталося. Немає повідомлення про помилку, лише невловима помилка, яку можна відстежити.


6

У моєму випадку мені довелося вилучити компіляцію build.gradle мого додатка 'com.android.support:appcompat-v7:21.0.3'.

Примітка : Мій min sdk = 14, і створений проект андроїд-студії вставив мою непотрібну залежність.

Після цієї заміни ви можете написати android: showAsAction = "завжди"


Спасибі це вирішило мене! Цей день, можливо, найкраще рішення у більшості випадків, оскільки непотрібно підтримувати версії Android до 4.0.
pinyin_samu

Ваша відповідь та Бейкер - це правильне рішення для мене.
хата

4

Це може бути не вашим випадком, але я використовував

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

змінивши його на

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

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


0
<?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.

Я думаю, що попередження можна ігнорувати.


0

додати спеціальний простір імен таким чином, щоб 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

Я вирішив це, замінивши

android:showAsAction="ifRoom"

з

app:showAsAction="ifRoom"

Тобто так виглядає меню XML,

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

0

Найпростіший спосіб - змінити код, додавши

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.