Следует использовать 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 ответов

Вам нужно сделать три вещи

  1. Добавьте эти 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"

  2. добавлять yourapp:showAsAction="ifRoom" на ваш <item>,

  3. Наконец, очистите ваш проект через 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>
Другие вопросы по тегам