Android 4.3 пункт меню showAsAction=" всегда " игнорируется
Я использую новую библиотеку V7 appcompat, доступную начиная с 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 много раз раньше.
12 ответов:
возможно, Вам не хватает необходимого пространства имен:
<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 должно основываться на имени вашего приложения, но это может быть любое имя, которое вы хотите, и доступно только в области файла, в котором вы его объявляете.)
разобрался сам. С библиотекой поддержки 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>
также убедитесь, что вы используете правильный надуватель в 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 и поддерживает фрагменты 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); } }
в моем случае, мне пришлось удалить из сборки моего приложения.gradle compile ' com.андроид.поддержка: appcompat-v7: 21.0.3'.
обратите внимание: My min sdk = 14, и созданный проект android studio вставил мою ненужную зависимость.
после этой замены вы можете написать android: showAsAction= "всегда"
также убедитесь, что у вас есть правильный путь для пространства имен. Это не даст вам сообщение об ошибке, если это неправильно.
Я
<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 часть пути, но это произошло. Нет сообщения об ошибке,просто неуловимая ошибка для отслеживания.
Это может быть не ваш случай, но я был с помощью
new MenuInflater(this).inflate(R.menu.my_menu, menu);изменение его
getMenuInflater().inflate(R.menu.my_menu, menu);Исправлена проблема!
была та же проблема.
Я
<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
смотрите "предупреждение"
следует использовать приложение: showAsAction с библиотекой appcompat с помощью описание:приложение="http://schemas.android.com/apk/res-auto" меньше... (Ctrl+F1)
при использовании библиотеку совместимости приложений,ресурсов меню следует обратиться к showAsAction в приложении: пространство имен, не android: пространство имен.
аналогично, когда не используется библиотека appcompat, вы должны использовать атрибут android:showAsAction.
Я думаю, что предупреждение можно игнорировать.
добавить пользовательское пространство имен, как это 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" />
самый простой способ-это:
<?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>
Comments