Элемент меню 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 много раз прежде.
15 ответов
Сам разобрался. С библиотекой поддержки 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>
Возможно, вам не хватает необходимого пространства имен:
<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 должно основываться на имени вашего приложения, но это может быть любое имя, которое вы хотите, и оно доступно только в пределах файла, в котором вы его объявляете.)
Также убедитесь, что вы используете правильный метод 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);
Для фрагментов
Меню с пользовательским пространством имен не позволяют показывать 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, на случай, если это что-то изменит.
У меня та же проблема, но на 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);
}
}
Также убедитесь, что у вас есть правильный путь для пространства имен. Оно не выдаст вам сообщение об ошибке, если оно не так.
я имел
<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, но это случилось. Нет сообщения об ошибке, просто неуловимая ошибка, чтобы выследить.
В моем случае мне пришлось удалить из моего приложения build.gradle compile 'com.android.support:appcompat-v7:21.0.3'.
Обратите внимание: мой min sdk = 14, и созданный проект на android studio вставил мою ненужную зависимость.
После этой замены вы можете написать Android:showAsAction="всегда"
Это может быть не ваш случай, но я использовал
new MenuInflater(this).inflate(R.menu.my_menu, menu);
меняя его на
getMenuInflater().inflate(R.menu.my_menu, menu);
исправил проблему!
В дополнение к ответу @petrnohejl, в Котлине вы можете просто использовать эту строку без предварительной ее инициализации.
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.options_menu, menu)
return true
}
В моем случае пункт меню просто игнорировал мой app:showAsAction="always" или "ifRoom", и это действительно раздражает меня часами. Затем, после поиска в StackOverflow, я понял, что использую не тот MenuInflater.
Самый простой способ это:
<?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>
Я решил это, заменив
android:showAsAction="ifRoom"
с
app:showAsAction="ifRoom"
Это выглядит как menuitme xml,
<item android:id="@+id/action_refresh"
android:title="Refresh"
android:icon="@drawable/refresh2"
app:showAsAction="ifRoom" />
Добавьте пользовательское пространство имен, например, в 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" />
Была такая же проблема.
я имел
<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>
<?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>
не работает, с 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.
Я думаю, что предупреждение можно игнорировать.
Самый простой способ - изменить ваш код, добавив
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>