Пункт меню 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>