Почему Android не может разрешить символ, но он все еще работает? - PullRequest
0 голосов
/ 05 мая 2018

У меня есть FrameLayout, который имеет волновой эффект при нажатии. Для этого у меня есть тег на FrameLayout:

android:foreground="?attr/selectableItemBackgroundBorderless"

Проблема в том, что я получаю сообщение об ошибке: "Не удается разрешить символ '? Attr / selectableItemBackgroundBorderless'" . Несмотря на ошибку, я все еще могу запустить проект, и FrameLayout дает желаемый эффект.

Но если я попытаюсь использовать этот тег вместо:

android:foreground="?android:attr/selectableItemBackgroundBorderless"

Я получил еще одну ошибку. Там написано, что для этого тега требуется уровень API 21.

Итак, мой вопрос: как правильно это сделать? Должен ли я продолжать использовать тот, который не может разрешить символ и игнорировать ошибку? Есть ли другой способ иметь подобное поведение с другим тегом?

Ответы [ 6 ]

0 голосов
/ 29 сентября 2018

Установите значение android:background="?android:attr/selectableItemBackground"

0 голосов
/ 21 мая 2018

Мне помогло:

  1. Откройте ваш проект в Android Studio.
  2. Сборка -> Чистый проект.
  3. Открыть каталог проекта.
  4. Удалить следующие каталоги: .idea, .gradle
  5. Вернитесь в Android Studio.
  6. Файл -> Неправильные кэши / перезапуск ... -> Неправильный и перезапуск.
  7. Файл -> Синхронизировать проект с файлами Gradle

Надеюсь, это поможет вам.

0 голосов
/ 19 мая 2018

android:foreground="?android:attr/selectableItemBackgroundBorderless" должен использоваться только для API 21 или более поздней версии. Если вам нужна версия app-compat, вы должны удалить часть android. (Вы также можете удалить часть attr, что равносильно тому, чтобы не удалять ее).

Оба приведенных ниже метода будут работать для API ниже 21 и абсолютно одинаковы:

android:foreground="?attr/selectableItemBackgroundBorderless"

android:foreground="?selectableItemBackgroundBorderless"

0 голосов
/ 18 мая 2018

Вместо прямого назначения android:foreground, пусть ваш FrameLayout использует стиль:

<FrameLayout 
    style="@style/MyStyle"
    ....>

На res/values/styles.xml добавить следующее:

<style name="MyStyle">
    <item name="android:foreground">?attr/selectableItemBackgroundBorderless</item>
</style>

Затем на res/values-v21/styles.xml добавьте символ с префиксом android::

<style name="MyStyle">
    <item name="android:foreground">?android:attr/selectableItemBackgroundBorderless</item>
</style>
0 голосов
/ 15 мая 2018

Из исходного кода библиотеки поддержки appcompat-v7 видно, что ?attr/selectableItemBackgroundBorderless является псевдонимом для ?android:attr/selectableItemBackgroundBorderless:

<item name="selectableItemBackgroundBorderless">?android:attr/selectableItemBackgroundBorderless</item>

А из исходного кода платформы Android видно, что selectableItemBackgroundBorderless - это ресурс, добавленный в версию 21 платформы:

<public type="attr" name="selectableItemBackgroundBorderless" id="0x0101045c" />

Когда вы используете следующее:

android:foreground="?attr/selectableItemBackgroundBorderless"

Вы используете ресурс, который поддерживает библиотеку. Ошибка, на мой взгляд, заключается в том, что Android Studio пытается узнать исходный ресурс, который не найден в API ниже 21. Поскольку исходный ресурс не найден, он откроется ресурсом, предоставленным библиотекой поддержки.

0 голосов
/ 14 мая 2018

?android:attr/selectableItemBackgroundBorderless для пульсации, выходящей за пределы вида. Это будет привлечено и ограничено, ближайший родительский элемент представления с ненулевым фоном.

  • selectableItemBackgroundBorderless - это новый атрибут, введенный в Уровень API 21 .

Если вы хотите использовать это, откройте MODULE LEVEL build.gradle и установите

    compileSdkVersion 27
    buildToolsVersion "27.0.3"
    defaultConfig {
        applicationId "\\"
        minSdkVersion 21
        targetSdkVersion 27

Убедитесь, что добавили google() в ваш PROJECT LEVEL build.gradle раздел.

repositories {
        ....
        google() //maven { url 'https://maven.google.com' }
    }

СТРУКТУРА

<!-- Background drawable for borderless standalone items that need focus/pressed states. -->
 <attr name="selectableItemBackgroundBorderless" format="reference" />

Примечание

Если ваш код намеренно обращается к новым API, и у вас есть гарантирует (например, с условным выполнением), что этот код будет только когда-либо вызываться на поддерживаемой платформе, то вы можете аннотировать класс или метод с аннотацией @TargetApi, указывающей локальный минимальный SDK для применения, такой как @TargetApi (11), так что эта проверка считает 11, а не минимальный SDK вашего файла манифеста в качестве требуемый уровень API.

XML для этого,

android:foreground="?android:attr/selectableItemBackgroundBorderless"
tools:targetApi="lollipop"

Для получения дополнительной информации,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...