ไลบรารีรองรับการออกแบบ Android สำหรับ API 28 (P) ไม่ทำงาน


108

ฉันกำหนดค่าสภาพแวดล้อม android-P SDK สำเร็จแล้ว เมื่อฉันพยายามใช้ไลบรารีสนับสนุนการออกแบบของ Android ฉันพบข้อผิดพลาดในการสร้างโครงการ การกำหนดค่าโครงการคือ:

IDE: 3.2 Canary 17 Target API: 28 Compile 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'
}

และสร้างข้อผิดพลาดที่ล้มเหลวคือ:

การควบรวมกิจการ Manifest ล้มเหลว: Attribute 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 value = (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/…
Rawa

ทำไมมันcomไม่ได้ถูกแทนที่ในmaterialในimplementation?
RoCk RoCk

58

การอัปเดตที่สำคัญ

Android 28.0.0จะไม่ปรับปรุงห้องสมุดการสนับสนุนหลัง

นี้จะมีการเปิดตัวคุณลักษณะที่ผ่านมาภายใต้บรรจุภัณฑ์ android.support และนักพัฒนามีกำลังใจที่จะโยกย้ายไป AndroidX 1.0.0

ดังนั้นการใช้ห้องสมุดAndroidX

  • อย่าใช้ทั้ง Supportและ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

มันเป็นข้อผิดพลาดทั่วไปที่เราทุกคนต้องเผชิญในตอนนี้ฉันต้องเผชิญกับมันทุกๆสองสามวันในการดำเนินโครงการ เพียงแค่ทำการ Invalidate cache แล้วรีสตาร์ท
เขมราช

@Talha ลองจากเมนูสร้าง> ล้างโปรเจ็กต์แล้วสร้าง> สร้างโปรเจ็กต์ก่อนบางครั้งสิ่งนี้ก็เพียงพอแล้วหากไม่เป็นเช่นนั้นให้ทำการยกเลิกการตรวจสอบแคชและรีสตาร์ทเนื่องจากแคชไม่ถูกต้องและการรีสตาร์ทจะใช้เวลามากและล้างแคชสำหรับโปรเจ็กต์ทั้งหมด
จอห์น

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

ฉันมีปัญหา: พบไฟล์มากกว่าหนึ่งไฟล์ที่มีเส้นทางอิสระของระบบปฏิบัติการ '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 หรือไม่
Carlos Santiago

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. เพิ่มรหัสเหล่านี้ใน app / 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 แบบเก่า
Lena Bru

สิ่งนี้สั่งให้ Studio 3.2 ขึ้นไปย้ายไปยัง AndroidX ไลบรารีทั้งหมดที่ย้ายไปยัง AndroidX จะได้รับการแก้ไขในการอ้างอิง
Abhinav Saxena

4

ครั้งแรกของทั้งหมดที่คุณควรมองgradle.propertiesและค่านิยมเหล่านี้จะต้องเป็นจริง หากคุณไม่สามารถมองเห็นได้คุณต้องเขียน

android.useAndroidX=true
android.enableJetifier=true

หลังจากที่คุณสามารถใช้อ้างอิงใน AndroidX คุณbuild.gradle (Module: แอป) นอกจากนี้คุณต้องตรวจสอบ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


3

หมายเหตุ: คุณไม่ควรใช้การอ้างอิง com.android.support และ com.google.android.material ในแอปของคุณพร้อมกัน

เพิ่ม Material Components สำหรับ Android ในไฟล์ build.gradle (app) ของคุณ

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 ใหม่คุณสามารถใช้ Material Components ผ่านการพึ่งพา com.android.support:design:28.0.0-alpha3


2

ฉันข้ามสถานการณ์ที่โดยการเปลี่ยนทั้งหมดเพื่อ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 มีความชัดเจนในเรื่องนี้ไปที่หน้าด้านล่างด้านล่างมีสองคอลัมน์ที่มีชื่อ"OLD BUILD ARTIFACT"และ"AndroidX build artifact"

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

ตอนนี้คุณมีการอ้างอิงมากมายในการไล่ระดับสีเพียงจับคู่สิ่งเหล่านั้นกับ Androidx build artifacts และแทนที่ใน gradle

นั่นจะไม่เพียงพอ

ไปที่ MainActivity ของคุณ (ทำซ้ำสิ่งนี้สำหรับกิจกรรมทั้งหมด) และลบคำว่า AppCompact Activity ในคำสั่ง "MainActivity คลาสสาธารณะขยาย AppCompatActivity" และเขียนคำเดิมอีกครั้ง แต่คราวนี้ไลบรารี androidx ถูกนำเข้าจนถึงขณะนี้ไฟล์สนับสนุน appcompact ถูกนำเข้าและ ใช้แล้ว (ลบคำสั่งนำเข้า appcompact นั้นด้วย)

ไปที่ไฟล์เลย์เอาต์ของคุณด้วย สมมติว่าคุณมีเลย์เอาต์ข้อ จำกัด จากนั้นคุณจะสังเกตเห็นว่าเลย์เอาต์ข้อ จำกัด บรรทัดแรกในไฟล์ xml มีบางอย่างที่เกี่ยวข้องกับ appcompact ดังนั้นเพียงแค่ลบมันและเขียนเลย์เอาต์ข้อ จำกัด อีกครั้ง แต่ตอนนี้เลย์เอาต์ข้อ จำกัด ที่เกี่ยวข้องกับ androidx ถูกเพิ่มเข้ามา

ทำซ้ำสิ่งนี้สำหรับกิจกรรมต่างๆและไฟล์เลย์เอาต์ xml ให้มากที่สุด ..

แต่ไม่ต้องกังวล: Android Studio แสดงข้อผิดพลาดที่เป็นไปได้ทั้งหมดขณะคอมไพล์


0

มีปัญหาที่คล้ายกัน เพิ่มใน build.gradle แล้วมันก็ใช้ได้สำหรับฉัน

 compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

0

หากคุณต้องการแก้ปัญหานี้โดยไม่ต้องย้ายไปใช้ AndroidX (ฉันไม่แนะนำ)

ปัญหาการรวมรายการนี้เกี่ยวข้องกับการพึ่งพาของคุณโดยใช้ androidX

คุณต้องลดเวอร์ชันรีลีสของการอ้างอิงนี้ สำหรับกรณีของฉัน:

ฉันใช้ Google หรือ Firebase

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

ฉันต้องลดมัน 15.0.1 เพื่อใช้ในไลบรารีสนับสนุน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.