Следует использовать Android:showAsAction, когда не используется библиотека appcompat
У меня странная проблема, я использовал файл menu.xml в своем приложении для Android, например:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:compat="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/action_refresh"
android:orderInCategory="100"
android:title="@string/action_refresh"
android:icon="@drawable/toc"
compat:showAsAction="always"/>
</menu>
и это работало хорошо, но несколько дней назад я обновлял свое затмение до последней версии, и после этого приложение:showAsAction="всегда" показывает ошибку:
Следует использовать android:showAsAction, когда библиотека appcompat не используется, и после этого значки панели действий были перемещены на панель переполнения и вообще не отображаются на панели действий.
в любом случае, библиотека appcompat является родителем моего базового стиля. что я должен сделать, чтобы решить это?
7 ответов
Вам нужно сделать три вещи
Добавьте эти 3 вещи
xmlns:tools="schemas.android.com/tools" tools:context="com.example.sample.YourActivity" xmlns:yourapp="http://schemas.android.com/apk/res-auto"
на ваш<menu>
тегнаряду с обычным
xmlns:android="http://schemas.android.com/apk/res/android"
добавлять
yourapp:showAsAction="ifRoom"
на ваш<item>
,Наконец, очистите ваш проект через Project -> Clean...
Последний шаг - это то, что решило это для меня. Простая очистка проекта (иногда они могут испачкаться)
Вот как выглядит окончательный код:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="schemas.android.com/tools"
tools:context="com.example.sample.YourActivity"
xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/action_share"
android:orderInCategory="100"
android:title="Share"
android:icon="@drawable/ic_share_white"
yourapp:showAsAction="ifRoom" />
</menu>
Это работает для меня, я использовал appcompatlibrary:
compat:showAsAction="always"
вместо:
app:showAsAction="always"
И чтобы использовать compat:showAsAction="always", внутри menu.xml включите строку:
<menu
......
<!-- include the below line -->
xmlns:compat="http://schemas.android.com/apk/res-auto" >
Столкнулся с такой же проблемой. Эти два варианта работали для меня:
1.Включая - xmlns:compat="http://schemas.android.com/apk/res-auto" > и затем используя: "compat: showAsAction =" ifRoom "/>"
2. Не включая compat и просто используя: app: showAsAction = "ifRoom" />
PS: используя Android Studio.
Следует использовать Android: showAsAction, когда не используется библиотека appcompat
Проблема: Гарантирует, что пункты меню используют правильное пространство имен. Идентификатор: AppCompatResource
При использовании библиотеки appcompat ресурсы меню должны ссылаться на showAsAction в пространстве имен app:, а не на пространство имен android:.
Аналогично, если вы не используете библиотеку appcompat, вам следует использовать атрибут android: showAsAction.
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:compat="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/action_refresh"
android:orderInCategory="100"
android:title="@string/action_refresh"
android:icon="@drawable/toc"
tools:ignore="AppCompatResource"
compat:showAsAction="always"/>
</menu>
Все, что вам нужно сделать, это добавить следующую строку в ваш item
элемент для подавления предупреждения. Имея пространство имен как compat
против app
за "http://schemas.android.com/apk/res-auto"
на самом деле не делает ничего особенного.
tools:ignore="AppCompatResource"
полный код:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:compat="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/action_refresh"
android:orderInCategory="100"
android:title="@string/action_refresh"
android:icon="@drawable/toc"
tools:ignore="AppCompatResource"
compat:showAsAction="always"/>
</menu>
Обратите внимание compat
тег может быть app
или что хочешь.
У меня была такая же проблема в моем многомодульном проекте Gradle. Об этом сообщает Android Lint CLI.
Среда выпуска
Мои модули выглядят так:
feature_home
является AppCompat
модуль, в котором есть меню вроде:
<?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/edit"
android:icon="@drawable/ic_edit"
android:title="@string/edit"
app:showAsAction="always" />
</menu>
Я хотел запустить Android Lint для всего приложения с помощью одного ./gradlew
, поэтому я добавил следующую опцию lint в app/build.gradle
:
lintOptions {
checkDependencies true
}
Затем, когда я бегу ./gradlew :feature_home:lint
, все было нормально, но когда я попытался проверить все модули через ./gradlew :app:lint
, У меня возникла тема: Error: Should use android:showAsAction when not using the appcompat library
.
Решение
Проблема была в моем app
модуль не был AppCompat
. Итак, добавивAppCompat
зависимость от app/build.gradle
решил вопрос:
implementation "androidx.appcompat:appcompat:$appcompat_version"
Для меня работает этот подход:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<item
android:id="@+id/maker_appbar_next"
android:title="@string/next"
app:showAsAction="always"
tools:ignore="AppCompatResource" />
</menu>