Библиотека поддержки дизайна Android для API 28 (P) не работает


106

Я успешно настроил среду SDK для Android-P. Когда я пытаюсь использовать библиотеку поддержки дизайна Android, я сталкиваюсь с ошибками сборки проекта. Конфигурации проекта:

IDE: 3.2 Canary 17 Целевой API: 28 API компиляции: 28

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.app.navigationpoc"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.0-alpha3'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.1'

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.0-alpha3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha3'

    implementation 'com.android.support:design:28.0.0-alpha3'
    implementation 'com.android.support:cardview-v7:28.0.0-alpha3'
}

И ошибка сборки:

Не удалось объединить манифест: атрибут application @ appComponentFactory value = (androidx.core.app.CoreComponentFactory) из [androidx.core: core: 1.0.0-alpha3] AndroidManifest.xml: 22: 18-86 также присутствует на [com.android .support: support-compat: 28.0.0-alpha3] AndroidManifest.xml: 22: 18-91 значение = (android.support.v4.app.CoreComponentFactory). Предложение: добавьте 'tools: replace = "android: appComponentFactory"' к элементу в AndroidManifest.xml: 6: 5-40: 19 для переопределения.


Вы проверили этот ответ: stackoverflow.com/a/54825603/1318946
Pratik Butani

Ответы:


89

Вы можете использовать либо предыдущую версию артефактов пакетов API, либо новую версию Androidx, но не то и другое одновременно.

Если вы хотите использовать предыдущую версию, замените свои зависимости на

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0-alpha3'
    implementation 'com.android.support.constraint:constraint-layout:1.1.1'

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation 'com.android.support:design:28.0.0-alpha3'
    implementation 'com.android.support:cardview-v7:28.0.0-alpha3'
}

если вы хотите использовать Androidx:

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.0-alpha3'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.1'

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.0-alpha3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha3'

    implementation 'com.google.android.material:material:1.0.0-alpha3'
    implementation 'androidx.cardview:cardview:1.0.0-alpha3'
}

2
Этот ответ должен быть принятым. Больше информации на medium.com/mindorks/…
Рава

Почему его comне заменить в materialв implementation?
RoCk RoCk

58

Важное обновление

Android не будет обновлять библиотеки поддержки после 28.0.0.

Это будет последний выпуск функции в пакете android.support, и разработчикам рекомендуется перейти на AndroidX 1.0.0 .

Так что используйте библиотеку AndroidX .

  • Не используйте в проекте одновременно поддержку и AndroidX .
  • Ваш библиотечный модуль или зависимости могут по-прежнему иметь библиотеки поддержки. Androidx Jetifier справится с этим.
  • Используйте стабильную версию androidxили любую другую библиотеку, потому что альфа, бета, rc могут содержать ошибки, которые вы не хотите отправлять вместе с вашим приложением.

В твоем случае

dependencies {
    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.1'

    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.cardview:cardview:1.0.0'
}

это странно, мой проект долгое время был на P, но сегодня, когда я собираю, он начал выдавать ошибки библиотеки поддержки. Что мне здесь не хватает?
Talha

Это распространенная ошибка, с которой мы все сталкиваемся сейчас несколько дней, я сталкиваюсь с ней каждые несколько дней при запуске проекта. Просто сделайте недействительный кеш и перезапустите.
Khemraj

@Talha Попробуйте сначала из меню Build> Clear Project, затем Build> Make Project, иногда этого достаточно, если нет, то сделайте недействительный кеш и перезапустите, так как аннулирование кеша и перезапуск занимает много времени и очищает кеш для всех проектов.
Джон

43

Добавь это:

tools:replace="android:appComponentFactory"
android:appComponentFactory="whateverString"

в ваше приложение-манифест

<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    tools:replace="android:appComponentFactory"
    android:appComponentFactory="whateverString">

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


Что у вас внутри @string/action_settings?
Aliton Oliveira 07

У меня была проблема: найдено более одного файла с независимым от ОС путем 'META-INF / androidx.core_core.version
Aliton Oliveira

Ошибка после добавления 2 строк: * What went wrong: Execution failed for task ':app:generateDebugBuildConfig'. > org.xml.sax.SAXParseException; systemId: file:/C:/D/code/js/emps_app/android/app/src/main/AndroidManifest.xml; lineNumber: 14; columnNumber: 52; The prefix "tools" for attribute "tools:replace" associated with an element type "application" is not bound.
user938363

2
Вы добавили xmlns: tools = " schemas.android.com/tools " в заголовок AndroidManifest.xml?
Карлос Сантьяго

2
Манифест в android / src / debug / имеет аналогичный заголовок:<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
user938363,


9

Google представил новые зависимости AndroidX . Вам нужно перейти на AndroidX, это просто.

Я заменил все зависимости на зависимости AndroidX

Зависимость от старого дизайна

implementation 'com.android.support:design:28.0.0'

Новая зависимость дизайна AndroidX

implementation 'com.google.android.material:material:1.0.0-rc01'

вы можете найти зависимости AndroidX здесь https://developer.android.com/jetpack/androidx/migrate


Опция автоматической миграции AndroidX (поддерживается в Android Studio 3.3+)

Перенесите существующий проект на использование AndroidX, выбрав Refactor> Migrate to AndroidX в строке меню.


1
реализация 'com.google.android.material: material: 1.1.0-alpha05' это новая версия
Hitesh Tarbundiya

что поставить вместо import android.support.design.widget.TabLayout; ?
temirbek

6

1. Добавьте эти коды в ваше приложение / build.gradle:

configurations.all {
   resolutionStrategy.force 'com.android.support:support-v4:26.1.0' // the lib is old dependencies version;       
}

2.Изменена версия SDK и инструментов до 28:

compileSdkVersion 28
buildToolsVersion '28.0.3'
targetSdkVersion  28

2. В вашем файле AndroidManifest.xml вы должны добавить две строки:

<application
    android:name=".YourApplication"
    android:appComponentFactory="anystrings be placeholder"
    tools:replace="android:appComponentFactory"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar">

Спасибо за ответ @Carlos Santiago: библиотека поддержки дизайна Android для API 28 (P) не работает


Это решение несовместимо с будущим, так как вы должны использовать AndroidX сейчас. Старые опубликованные приложения должны быть обновлены сейчас. Если будет много доработок, эти изменения все равно следует внести.
Abhinav Saxena

@Abhinav Saxena Вы правы, мы должны обновить наш проект до 28 лучше, чем решить эту проблему с помощью старой версии SDK. :)
Codios

это принятый ответ. После множества предложений мне ничего не помогло, но это помогло мне как configurations.all {}. Ты спас мне день, спасибо.
Noor Hossain


4

откройте файл gradle.properties и добавьте в него эти две строки:

android.useAndroidX = true
android.enableJetifier = true

чистить и строить


1
useAndroidX сообщает компилятору пользователю androidx. файлы вместо старого пакета поддержки Android
Лена Брю

Это заставляет Studio 3.2 и более поздние версии перейти на AndroidX. Все библиотеки, которые перешли на AndroidX, должны быть исправлены в зависимостях.
Abhinav Saxena

3

Примечание. Вы не должны использовать зависимости com.android.support и com.google.android.material в своем приложении одновременно.

Добавьте компоненты материалов для Android в файл build.gradle (приложение)

dependencies {
    // ...
    implementation 'com.google.android.material:material:1.0.0-beta01'
    // ...
  }

Если ваше приложение в настоящее время зависит от исходной библиотеки поддержки дизайна, вы можете использовать опцию Refactor to AndroidX…, предоставляемую Android Studio. Это обновит зависимости и код вашего приложения, чтобы использовать недавно упакованные библиотеки androidx и com.google.android.material.

Если вы пока не хотите переходить на новые пакеты androidx и com.google.android.material, вы можете использовать компоненты материала через зависимость com.android.support:design:28.0.0-alpha3.


3

Прежде всего, вы должны посмотреть gradle.properties, и эти значения должны быть верными . Если вы не можете их увидеть, вы должны написать.

android.useAndroidX=true
android.enableJetifier=true

После этого вы можете использовать зависимости AndroidX в своем build.gradle (Module: app) . Кроме того, вы должны проверить compileSDKVersion и targetVersion . Их должно быть минимум 28. Например, я использую 29.

Итак, пример зависимости androidx:

implementation 'androidx.cardview:cardview:1.0.0'

Однако будьте осторожны, потому что все начинается не с androidx, как зависимость от cardview . Например, зависимость старого дизайна :

implementation 'com.android.support:design:27.1.1'

Но зависимость нового дизайна :

implementation 'com.google.android.material:material:1.1.0'

Итак, вам придется искать и внимательно читать. Счастливый код.

@canerkaseler


2

Я преодолеваю эту ситуацию, заменив all androidx.*на appropiate package name.

измени свою линию

implementation 'androidx.appcompat:appcompat:1.0.0-alpha3'
implementation 'androidx.constraintlayout:constraintlayout:1.1.1'

androidTestImplementation 'androidx.test:runner:1.1.0-alpha3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha3'

к

implementation 'com.android.support:appcompat-v7:28.0.0-alpha3'
implementation 'com.android.support.constraint:constraint-layout:1.1.1'

androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

ПРИНЯТО К СВЕДЕНИЮ

  • удалить tools:replace="android:appComponentFactory"из AndroidManifest

0

Код ниже отлично работал со мной:

dependencies {
    api 'com.android.support:design:28.0.0-alpha3'

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

    testImplementation 'junit:junit:4.12'

    androidTestImplementation 'androidx.test:runner:1.1.0-alpha2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha2'
}


0

Документация Android четко об этом. Перейдите на страницу ниже. Под ней есть два столбца с названиями «СТАРЫЙ ИСКУССТВО СБОРКИ » и «Артефакт сборки AndroidX».

https://developer.android.com/jetpack/androidx/migrate

Теперь у вас есть много зависимостей в gradle, просто сопоставьте те, которые имеют артефакты сборки Androidx, и замените их в gradle.

Этого будет недостаточно.

Перейдите в свою MainActivity (повторите это для всех действий) и удалите слово AppCompact Activity в заявлении «общедоступный класс MainActivity расширяет AppCompatActivity» и снова напишите то же слово. Но на этот раз будет импортирована библиотека androidx. До сих пор файл поддержки appcompact был импортирован и used (также удалите этот оператор импорта appcompact).

Также перейдите в свой файл макета. Предположим, у вас есть макет ограничения, тогда вы можете заметить, что макет ограничения первой строки в файле xml имеет что-то, связанное с appcompact, поэтому просто удалите его и снова напишите макет ограничения. Но теперь добавляется макет ограничения, связанный с androidx.

повторите это для такого количества действий и для такого количества файлов макета xml ..

Но не волнуйтесь: Android Studio отображает все такие возможные ошибки при компиляции.



0

если вы хотите решить эту проблему без перехода на AndroidX (не рекомендую)

эта проблема слияния манифестов связана с одной из ваших зависимостей, использующих androidX.

вам необходимо уменьшить версию выпуска этой зависимости. для моего случая:

Я использовал Google или Firebase

api 'com.google.android.gms:play-services-base:17.1.0'

Мне нужно уменьшить его до 15.0.1, чтобы использовать в библиотеке поддержки.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.