android.view.InflateException เกิดข้อผิดพลาดในการขยายคลาส android.webkit.WebView


132

ใน Lollipop (API 22) ทุกครั้งในแอปพลิเคชันของฉันฉันแสดง Webview ว่าแอปพลิเคชันขัดข้อง ฉันขัดข้องหลายครั้งในคอนโซลนักพัฒนาซอฟต์แวร์ Android ที่เกี่ยวข้องกับเหตุการณ์นี้

ไม่ต้องบอกก็รู้ว่าใช้งานได้บน Android 4, 6 และ 7

การอ่านการติดตามสแต็ก (โพสต์ไว้ที่ส่วนท้ายของโพสต์นี้) มีบางอย่างทำให้ฉันติดขัด

Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040003

ฉันค้นหาใน R.java ที่สร้างขึ้นโดยไม่มีโชคเห็นได้ชัดเพราะไม่มี ID แต่ก็คุ้มค่าที่จะลอง

Googling เกี่ยวกับปัญหาดูเหมือนจะเกี่ยวข้องกับวิธีที่อมยิ้มจัดการกับการดูเว็บ ฉันเริ่ม AVD ใหม่ด้วยอมยิ้มจากอุปกรณ์ที่ฉันพบในรายงานการขัดข้องใน GDC และฉันสามารถสร้างปัญหาซ้ำได้


การติดตามสแต็กแบบเต็ม:

android.view.InflateException: Binary XML file line #7: Error inflating class android.webkit.WebView
                  at android.view.LayoutInflater.createView(LayoutInflater.java:633)
                  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55)
                  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682)
                  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
                  at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
                  at it.artecoop.ibreviary.WebViewFragment.onCreateView(WebViewFragment.java:67)
                  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
                  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
                  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682)
                  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:135)
                  at android.app.ActivityThread.main(ActivityThread.java:5254)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
               Caused by: java.lang.reflect.InvocationTargetException
                  at java.lang.reflect.Constructor.newInstance(Native Method)
                  at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
                  at android.view.LayoutInflater.createView(LayoutInflater.java:607)
                  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55) 
                  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682) 
                  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741) 
                  at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
                  at it.artecoop.ibreviary.WebViewFragment.onCreateView(WebViewFragment.java:67) 
                  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087) 
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113) 
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295) 
                  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) 
                  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682) 
                  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541) 
                  at android.os.Handler.handleCallback(Handler.java:739) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:135) 
                  at android.app.ActivityThread.main(ActivityThread.java:5254) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:372) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
               Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040003
                  at android.content.res.Resources.getText(Resources.java:299)
                  at android.content.res.Resources.getString(Resources.java:385)
                  at com.android.org.chromium.content.browser.ContentViewCore.setContainerView(ContentViewCore.java:684)
                  at com.android.org.chromium.content.browser.ContentViewCore.initialize(ContentViewCore.java:608)
                  at com.android.org.chromium.android_webview.AwContents.createAndInitializeContentViewCore(AwContents.java:631)
                  at com.android.org.chromium.android_webview.AwContents.setNewAwContents(AwContents.java:780)
                  at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:619)
                  at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:556)
                  at com.android.webview.chromium.WebViewChromium.initForReal(WebViewChromium.java:311)
                  at com.android.webview.chromium.WebViewChromium.access$100(WebViewChromium.java:96)
                  at com.android.webview.chromium.WebViewChromium$1.run(WebViewChromium.java:263)
                  at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.drainQueue(WebViewChromium.java:123)
                  at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue$1.run(WebViewChromium.java:110)
                  at com.android.org.chromium.base.ThreadUtils.runOnUiThread(ThreadUtils.java:144)
                  at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.addTask(WebViewChromium.java:107)
                  at com.android.webview.chromium.WebViewChromium.init(WebViewChromium.java:260)
                  at android.webkit.WebView.<init>(WebView.java:554)
                  at android.webkit.WebView.<init>(WebView.java:489)
                  at android.webkit.WebView.<init>(WebView.java:472)
                  at android.webkit.WebView.<init>(WebView.java:459)
                  at java.lang.reflect.Constructor.newInstance(Native Method) 
                  at java.lang.reflect.Constructor.newInstance(Constructor.java:288) 
                  at android.view.LayoutInflater.createView(LayoutInflater.java:607) 
                  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55) 
                  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682) 
                  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741) 
                  at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
                  at it.artecoop.ibreviary.WebViewFragment.onCreateView(WebViewFragment.java:67) 
                  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087) 
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113) 
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295) 
                  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) 
                  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682) 
                  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541) 
                  at android.os.Handler.handleCallback(Handler.java:739) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:135) 
                  at android.app.ActivityThread.main(ActivityThread.java:5254) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:372) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

ดูเหมือนว่าระบบจะมีWebViewปัญหา ฉันไม่รู้ว่าอีมูเลเตอร์ได้รับการอัปเดตหรือไม่ คุณลองฮาร์ดแวร์แล้วหรือยัง?
CommonsWare

@commonsware ไม่ฉันไม่มีอุปกรณ์ใด ๆ ในขณะนี้กับอมยิ้ม แต่ผู้รายงานข้อขัดข้องกำลังแสดงรายการหลายรายการสำหรับสิ่งนี้
Valerio

18
คำถามนี้เกิดจากปี 2559 แต่ปัญหานี้กำลังปรากฏอีกครั้งในปลายปี 2019 หากคุณมาที่นี่จากการค้นหาเว็บอย่าลืมเลือกคำตอบที่ตรงกับคุณ
user1032613

ฉันไม่มีอุปกรณ์จริงของ API ระดับ 21 ฉันลองเรียกใช้แอปบน Genymotion และโปรแกรมจำลอง Android ที่มี API ระดับ 21 แต่เกิดขัดข้อง! ใครก็ตามที่นี่แจ้งให้เราทราบว่ามันจะทำงานบนอุปกรณ์ทางกายภาพ! ตอนนี้แอพของฉันตกอยู่ในความเสี่ยง!
Sumit Shukla

สำหรับฉัน Google Play รายงานปัญหาใน Huawei P8 Lite ที่ใช้ Android 5.0 แต่ไม่ปรากฏบน Samsung Note 4 จริงที่ใช้ Android 6.0.1 หรือแท็บเล็ต Samsung Note 8 ที่ใช้ Android 4.4.2
FractalBob

คำตอบ:


172

ถ้าคุณใช้androidx.appcompat:appcompat:1.1.0ลองandroidx.appcompat:appcompat:1.0.2แทน มันก็ดูเหมือนว่า1.1.0ไม่สามารถแก้ไขข้อผิดพลาดที่มีWebViewใน 5.1.1Android

การอัปเดตเดือนกุมภาพันธ์ 2020: การเปลี่ยนกลับเป็น1.0.2หยุดทำงานสำหรับคนจำนวนมาก (รวมถึงแอปของฉัน) แต่การใช้เวอร์ชันปัจจุบันandroidx.appcompat:appcompat:1.2.0-alpha02ช่วยแก้ไขข้อขัดข้อง (ฉันเห็นมันใน Huawei P8 Lite ที่ใช้ Android 5.0 ระหว่างการทดสอบ "รายงานก่อนการเปิดตัว" อัตโนมัติของ Google)

การอัปเดตมิถุนายน 2020: มีรุ่นใหม่กว่าที่ระบุไว้ในการอัปเดตเดือนกุมภาพันธ์ 2563 คุณสามารถดูเวอร์ชันที่มีอยู่ในปัจจุบันได้ที่นี่:


3
มีการแก้ไขข้อบกพร่องสำหรับการรักษา 1.1.0 และแก้ไขสิ่งนี้หรือไม่? เราพึ่งพาบางสิ่งที่ไม่มีอยู่ใน 1.0.2 และดูเหมือนว่า 1.1.0 เวอร์ชันอัลฟ่าหรือเบต้าบางรุ่นจะไม่มีข้อบกพร่องนี้
PampaZiya

3
ใช่การแก้ไขที่สะอาดขอบคุณ! ฉันใช้ beta01 และทุกอย่างดูเหมือนจะดี ฉันจะใช้มันต่อไปเพราะไม่มีประโยชน์ที่ชัดเจนในการใช้ 1.1.0 อยู่ดี
PampaZiya

11
มีปัญหาที่เกี่ยวข้องกับ regresion นี้: issueetracker.google.com/issues/141132133
Brais Gabin

3
ณ วันนี้การปรับลดรุ่นยังใช้งานไม่ได้ในกรณีของฉันวิธีแก้ปัญหานี้จากissueetracker.google.com/issues/141132133 ใช้งานได้: "วิธีที่ง่ายที่สุดในการแก้ปัญหานี้คือบังคับให้ Gradle ตั้งค่าเวอร์ชันเป็น 1.1.0- rc01 เพิ่มสิ่งนี้ลงในไฟล์ gradle ของคุณ configurations.all {resolutionStrategy {บังคับ 'androidx.appcompat: appcompat: 1.1.0-rc01'}} "
ทะลุ

3
androidx.appcompat:appcompat:1.2.0-alpha03ได้ผลเช่นกัน
Artyom

45

คำเตือน: วิธีแก้ปัญหานี้อาจทำให้บางสิ่งเสียหาย ดูความคิดเห็นสำหรับรายละเอียด

หากคุณต้องการขยาย WebView จากเลย์เอาต์ XML คุณสามารถรวมไว้ในคลาสย่อยที่ดี (ตามคำตอบของ ikostet ):

public class LollipopFixedWebView extends WebView {
    public LollipopFixedWebView(Context context) {
        super(getFixedContext(context));
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs) {
        super(getFixedContext(context), attrs);
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(getFixedContext(context), attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(getFixedContext(context), attrs, defStyleAttr, defStyleRes);
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr, boolean privateBrowsing) {
        super(getFixedContext(context), attrs, defStyleAttr, privateBrowsing);
    }

    public static Context getFixedContext(Context context) {
        return context.createConfigurationContext(new Configuration());
    }
}

แก้ไข: ตอนนี้ดีกว่าด้วย Kotlin

class LollipopFixedWebView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
    defStyleRes: Int = 0
) : WebView(context.createConfigurationContext(Configuration()), attrs, defStyleAttr, defStyleRes)

1
ฉันพบปัญหาเดียวกันและใช้วิธีนี้ในการแก้ไขขอบคุณ
itsa04g9

การอัปเดต Android WebView บนอุปกรณ์ยังช่วยแก้ปัญหาได้
ชื่อที่แสดง

2
ยังคงเป็นปัญหาในปี 2019 และใช้งานได้ แต่ฉันไม่รู้ว่าทำไม / อย่างไรมันจะดีถ้ามีการอธิบายสิ่งนี้ นอกจากนี้ฉันยังได้รับคำเตือน Is never used on the 4th constructor "public LollipopFixedWebView (Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
David

4
คำเตือนเกี่ยวกับวิธีแก้ปัญหานี้: การสร้างอินสแตนซ์ WebView ด้วยบริบทว่างเปล่าอาจทำให้เกิดผลข้างเคียงโดยไม่ได้ตั้งใจ ตัวอย่างเช่น ActionModes จาก WebView อาจไม่สามารถใช้งานได้อีกต่อไป (เช่นการกดแบบยาวเพื่อเน้นข้อความ)
Dmitry Brant

5
ดังที่ @DmitryBrant กล่าวว่าโปรดใช้ความระมัดระวังเป็นอย่างยิ่งเมื่อใช้สิ่งนี้เพราะสิ่งนี้จะทำลายบางสิ่งรวมถึงช่องแบบเลื่อนลงและการกดค้างเพื่อเน้นข้อความ !
user5507535

42

หากคุณกำลังใช้androidx.appcompat:appcompat:1.1.0และไม่ต้องการดาวน์เกรดandroidx.appcompat:appcompat:1.0.2หรืออัปเกรดเป็นandroidx.appcompat:appcompat:1.2.0-alpha03มีวิธีแก้ปัญหาอื่นซึ่งอธิบายไว้ในความคิดเห็นนี้ในเครื่องมือติดตามปัญหาของ Google

ฉันสังเกตเห็นว่าหลังจากเรียกใช้ applyOverrideConfiguration Context.getAssets()และContext.getResources().getAssets()ไม่ส่งคืนวัตถุ AssetManager เดียวกัน AssetManager ที่ส่งคืนจากContext.getAssets()ไม่สามารถเข้าถึงทรัพยากรในแพ็คเกจอื่น ๆ (รวมถึงแพ็คเกจ WebView ของระบบ) ทำให้ WebView หยุดทำงาน ถ้าฉันลบล้างContext.getAssets()เพื่อส่งคืนgetResources().getAssets()ปัญหาก็หายไป

จากความคิดเห็นนั้นคุณสามารถแทนที่getAssets()ในกิจกรรมของ WebView เพื่อให้แสดงความคิดเห็นgetResources().getAssets()แทนเพื่อแก้ปัญหา

ชวา

@Override
public AssetManager getAssets() {
    return getResources().getAssets();
}

Kotlin

override fun getAssets(): AssetManager {
    return resources.assets
}

3
คำตอบที่ดี +1
Shirane85

สวัสดีถ้าเป็นจริงสิ่งนี้จะได้รับการแก้ไขอย่างไรด้วยการเปิดตัว appCompact ซึ่งไม่เกี่ยวข้องกับตัวจัดการสินทรัพย์และตัวเว็บวิว
Sinapse

เมื่อดูรายการการเปลี่ยนแปลงนี้ดูเหมือนว่า webview บางเวอร์ชันกำลังมีปัญหากับการapplyOverrideConfigurationโทรภายในไลบรารี AppCompat
วีรา

34

คำแนะนำของฉันคือใช้แบบกำหนดเอง / ใหม่Configurationเฉพาะเมื่อ "อันเดิม" ก่อให้เกิดปัญหาดังนั้นใน Lollipop เท่านั้น โค้ด @SpaceBizon ทำงานได้ดีจนถึง Android 8.x บน 9 และ Q (เบต้าแบบ currenly) การกดเลือก / ดรอปดาวน์ทุกครั้งจะไม่แสดงAlertDialogตัวเลือกแทนที่จะเกิดการรั่วไหลของหน่วยความจำ ... ด้านล่างgetFixedContextวิธีการแก้ไขด้วยรหัสเวอร์ชันที่เหมาะสม "iffed"

public class LollipopFixedWebView extends WebView {

    public LollipopFixedWebView(Context context) {
        super(getFixedContext(context));
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs) {
        super(getFixedContext(context), attrs);
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(getFixedContext(context), attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(getFixedContext(context), attrs, defStyleAttr, defStyleRes);
    }

    private static Context getFixedContext(Context context) {
        if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 23) // Android Lollipop 5.0 & 5.1
            return context.createConfigurationContext(new Configuration());
        return context;
    }
}

21

หากคุณใช้ androidx.appcompat: appcompat: 1.1.0 ให้เปลี่ยนเป็น androidx.appcompat: appcompat: 1.0.2 หรือหากคุณต้องการใช้ธีม DayNight ให้แทนที่ applyOverrideConfiguration ในกิจกรรมของคุณดังนี้ (หมายเหตุ: ต้องรีสตาร์ทแอปในขณะที่เปลี่ยนจาก Dark Theme เป็น Light Theme และในทางกลับกัน)

override fun applyOverrideConfiguration(overrideConfiguration: Configuration?) {
        if (Build.VERSION.SDK_INT in 21..25 && (resources.configuration.uiMode ==  applicationContext.resources.configuration.uiMode)) {
                return
        }
        super.applyOverrideConfiguration(overrideConfiguration)
}

วิธีแก้ปัญหานี้ใช้งานได้ แต่ไม่ควรใช้21..22แทน21..25หรือไม่? ดูเหมือนปัญหาจะไม่เกิดขึ้นใน API 23+
Dmitry Brant

5
นี่คือการแก้ไขที่ทำให้เกิดความผิดพลาดนี้ - android.googlesource.com/platform/frameworks/support/+/... ดังนั้นตามรหัสข้อขัดข้องจะเกิดขึ้นใน API 21..25 ​​ในอุปกรณ์ที่ไม่ได้ติดตั้ง Google Play Store และเวอร์ชัน Android Webview คือ <50
AR Mythili Saran

กำลังดาวน์เกรดเป็น androidx.appcompat: appcompat: 1.0.2 ทำเคล็ดลับขอบคุณ
ทะลุ

3
วิธีแก้ปัญหาของฉันใน java ที่ดูเหมือนจะใช้ได้กับฉันเป็นแบบนี้ (ขออภัยสำหรับการจัดรูปแบบที่น่ากลัว แต่ไม่ใช่คำตอบใหม่เพียงแค่พอร์ต):@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
Mike Hardy

@ARMythiliSaran ทำไมคุณถึงบอกว่าสิ่งนี้เกิดขึ้นเฉพาะใน "อุปกรณ์ที่ไม่ได้ติดตั้ง Google Play Store และ Android Webview เวอร์ชัน <50"
อังเดร

20

หากคุณไม่ได้อาศัยการสลับธีม DayNight (หรือเหตุการณ์ UiMode อื่น ๆ ) คุณสามารถเพิ่มandroid: configChanges = "uiMode"ลงในรายการกิจกรรมการดูเว็บเพื่อป้องกันไม่ให้ AppCompatDelegate อัปเดตการกำหนดค่าทรัพยากรและทำให้อัตราเงินเฟ้อของ webview ยุ่งเหยิง


สิ่งนี้ได้ผลสำหรับฉัน ฉันต้องการ ConstraintLayout 1.1.3 ซึ่งต้องใช้ appcompat 1.1.0 ดังนั้นการย้อนกลับไม่ใช่ตัวเลือก
Matt Robertson

การดาวน์เกรดเป็น 1.0.2 ไม่ได้สร้างความแตกต่างให้กับฉัน แต่วิธีนี้ใช้ได้ผล
chrisbtoo

ทางออกที่ยอดเยี่ยม!
bojan

17

ลองใช้สำหรับสร้าง webview:

mWebView = new WebView(getActivity().createConfigurationContext(new Configuration()));

และไฟล์ xml ของฉัน?
Acauã Pitta

สิ่งนี้ช่วยแก้ปัญหาของฉันได้โดยไม่ต้องดาวน์เกรดเวอร์ชันไลบรารีใด ๆ
บกพร่องเกิดขึ้น

10

และอีกหนึ่งวิธีในการแก้ไขปัญหา ควรแทนที่วิธีนี้ในกิจกรรมของคุณ:

    @Override
    public void applyOverrideConfiguration(final Configuration overrideConfiguration) {
        if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 25) {
            overrideConfiguration.uiMode &= ~Configuration.UI_MODE_NIGHT_MASK;
        }
        super.applyOverrideConfiguration(overrideConfiguration);
    }

5

ฉันสามารถจำลองข้อขัดข้องบน API 21 ในโปรแกรมจำลองได้

ดังนั้นฉันจึงพยายามเพิ่มสิ่งนี้ในการใช้งานตามที่อธิบายไว้ในเอกสาร :

dependencies {
    def appcompat_version = "1.1.0"

    implementation "androidx.appcompat:appcompat:$appcompat_version"
    // For loading and tinting drawables on older versions of the platform
    implementation "androidx.appcompat:appcompat-resources:$appcompat_version"
}

การเพิ่มappcompat-resourcesไม่ได้ช่วยแก้ปัญหา

อาจจะเป็นเวอร์ชันในอนาคต แต่ฉันอยากจะพูดถึงว่าดูเหมือนว่าจะมีไลบรารีทรัพยากรเสริมที่ควรจะแก้ไขปัญหานี้ ดังนั้นเมื่อพยายามแก้ไขปัญหานี้ด้วยเวอร์ชันใหม่appcompatให้เพิ่มappcompat-resourcesไลบรารีด้วยเวอร์ชันเดียวกัน

การย้อนกลับเพื่อandroidx.appcompat:appcompat:1.0.2แก้ไขปัญหาเป็นวิธีแก้ปัญหาชั่วคราว


ฉันไม่สามารถเปลี่ยนกลับ"androidx.appcompat:appcompat-resources:$appcompat_version"เป็นเวอร์ชัน 1.0.2 "ข้อผิดพลาด: ไม่สามารถแก้ไขได้: androidx.appcompat: appcompat-resources: 1.0.2"
Murillo Comino

appcompat-resources ไม่พร้อมใช้งานสำหรับ 1.0.2 ดูคำตอบที่อัปเดตของฉัน
Manuel

ขอบคุณมากมันได้ผล ฉันหวังว่าในอนาคตจะแก้ปัญหานี้ได้
Murillo Comino

5

รหัสด้านล่างจะแก้ไขปัญหาได้ กรุณาเพิ่มในActivity:

@Override 
public AssetManager getAssets() {
    return getResources().getAssets(); 
}

3

เช่นเดียวกับบันทึกด้านข้างฉันพยายามอยู่พักหนึ่งแม้ว่าฉันจะลดระดับเป็น 1.0.2 เพียงเพราะฉันดูเหมือนจะมีการพึ่งพาสกรรมกริยากับ appcompat: 1.1.0 ผ่าน androidx.constraintlayout: constraintlayout: 2.0.0-beta3 เมื่อฉันลดระดับเป็น constraintlayout: 1.1.3 ทุกอย่างทำงานได้ดี

(อ้างอิงจากhttps://issuetracker.google.com/issues/141351441ปัญหาจะได้รับการแก้ไขเร็ว ๆ นี้ด้วย appcompat: 1.2.0-alpha02)


3

ฉันใช้เวอร์ชันล่าสุดจากแหล่งนี้ โปรดตรวจสอบและใช้ของคุณเองตามสิ่งที่คุณคิดว่าดีที่สุด

ในกรณีที่คุณต้องการข้ามการใช้งานด้านล่างจะช่วยแก้ปัญหา:

implementation 'androidx.appcompat:appcompat:1.2.0-beta01'

2

戴文锦ก็เหมาะกับฉันเช่นกัน แต่การดาวน์เกรดเพียงแค่ androidx.appcompat: appcompat: 1.1.0 ถึง 1.0.2 ไม่สำเร็จ

ฉันปรับลดรุ่น androidx ที่อัปเกรดก่อนหน้านี้ทั้งหมดจากไฟล์

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'com.google.android.material:material:1.1.0-alpha10'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.recyclerview:recyclerview:1.1.0-beta04'
implementation 'androidx.viewpager2:viewpager2:1.0.0-beta04'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
implementation 'androidx.preference:preference:1.1.0'
implementation 'androidx.core:core:1.2.0-alpha04'

กลับไปยัง

implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'com.google.android.material:material:1.1.0-alpha09'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.recyclerview:recyclerview:1.1.0-beta03'
implementation 'androidx.viewpager2:viewpager2:1.0.0-beta03'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0-rc01'
implementation 'androidx.preference:preference:1.1.0-rc01'
implementation 'androidx.core:core:1.2.0-alpha03'

การแจ้งเตือนว่าโค้ด Googles นั้นไม่มีข้อผิดพลาดและผ่านการทดสอบมาเป็นอย่างดีและไม่ควรมีใครอัปเกรดเวอร์ชันอย่างรวดเร็ว


คุณได้ดาวน์เกรด androidx.appcompat: appcompat เป็น 1.1.0-rc01 หรือไม่ ไม่ถึง 1.0.2?
Zhebzhik Babich

ลองใช้ 1.0.2 แต่ไม่สำเร็จ ต้องเป็นหนึ่งในการอ้างอิงอื่น ๆ ร่วมกับ appcompat
S. Gissel

การลดระดับandroidx.appcompat:appcompatก็ใช้ได้ผลสำหรับฉัน สำหรับผู้อ่านในอนาคตโปรดตรวจสอบว่า "การซิงค์แบบค่อยเป็นค่อยไป" และยืนยันว่าไม่เพียงพอสำหรับคุณก่อนที่จะดาวน์เกรดข้อมูลเพิ่มเติม
user1032613

หลังจากปรับลดรุ่นแล้วจะไม่ฟุ่มเฟือยในการตรวจสอบรุ่นของการอ้างอิงในโครงการstackoverflow.com/a/39020703/6055194
Zhebzhik Babich

2
/**
 * Customized WebView to avoid crashing on Android 5 and 6 (API level 21 to 23)
 * If the Android System WebView is old and is not updated, the WebView view inflation fails.
 * To reproduce the issue, try on OS 5 or 6 with Android System WebView 72.0.3626.76 (this version is just a reference point from being which we saw no crashes)
 */
class BrilliantWebView : WebView {

   companion object {
       private fun getBrilliantContext(context: Context?) =
            if (!OSUtils.hasNougat()) // OS < 24 or OS < 7.0
                context?.createConfigurationContext(Configuration())
            else
                context
    }

   constructor(context: Context?) : super(getBrilliantContext(context))
   constructor(context: Context?, attrs: AttributeSet?) : super(getBrilliantContext(context), attrs)
   constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(getBrilliantContext(context), attrs, defStyleAttr)
}

@ sumit-shukla โพสต์ข้อมูลโค้ดที่ช่วยเราแก้ไขปัญหา แต่อย่าลืมทำstackoverflow.com/a/57715955/2344192
ชื่อที่แสดง

2
โปรดใช้ความระมัดระวังวิธีแก้ปัญหานี้จะแบ่งช่องแบบเลื่อนลงและเลือกข้อความใน WebView
user5507535

2

AppCompat 1.2.0-alpha02 เปิดตัวแล้ววันนี้คุณจึงสามารถใช้

implementation 'androidx.appcompat:appcompat:1.2.0-alpha02'

ซึ่งจะแก้ไขปัญหา WebView บน Lollipop


มันแก้ไขปัญหาได้ แต่เนื่องจากเป็นเวอร์ชันอัลฟาจึงอาจทำให้เกิดข้อบกพร่องอื่น ๆ หากคุณได้ลองแล้วคุณยังไม่ประสบปัญหาอื่นใดในแอปของคุณใช่หรือไม่
Soheil

@ Soheil ไม่ฉันไม่เคยประสบกับความผิดพลาดใด ๆ แน่นอนว่าเวอร์ชันอัลฟ่ามีความเสี่ยงอยู่เสมอ ตัวอย่างเช่นมีการกล่าวถึงข้อบกพร่องของ alpha02 ที่นี่: issueetracker.google.com/issues/141351441#comment48
Dimitris Pattas

2

ฉันสามารถทำซ้ำปัญหานี้บน Nexus 7 API 22 ปัญหาได้รับการแก้ไขโดยการอัปเดต Android System WebView เวอร์ชันของแท็บเล็ตจากเวอร์ชัน 39 (2237560-arm)เป็นเวอร์ชัน 79.0.3945.136

นี่ไม่ได้อยู่ในการควบคุมของฉันสำหรับผู้ใช้ให้ทำสิ่งนี้ แต่เป็นวิธีแก้ปัญหาหากคุณต้องการช่วยให้ใครบางคนใช้แอปของคุณทันที


1

ปัญหาได้รับการแก้ไขสำหรับฉันโดยการปรับลดรุ่นเป็นการใช้งาน 'androidx.appcompat: appcompat: 1.0.2'


1

ในกรณีของฉันปัญหาอยู่ในวิธีการ

fun getUserId(): Int = userId

ของ MainActivity WebViewผมไม่ทราบว่าทำไมมันมีผลกระทบต่อ getUserId()ไม่มีการลบล้างหรือวิธีการสาธารณะของActivityคลาส ถ้าฉันเปลี่ยนชื่อหรือลบวิธีนี้WebViewจะเริ่มเปิดขึ้น ยังพยายามที่จะเปลี่ยนแปลง

private var userId: Int = 0

ถึง

var userId: Int = 0
    private set

นำไปสู่ข้อยกเว้นเดียวกัน ฉันเข้าใจว่าเมื่อใดที่เห็นข้อยกเว้น: Caused by: java.lang.SecurityException: Permission Denial: null asks to run as user 123456 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL or android.permission.INTERACT_ACROSS_USERS. ในกรณีที่ผู้ใช้ที่ = 123456 WebViewในความเป็นจริงผู้ใช้อำนาจของฉันที่ถูกใช้ในการร้องขอบางส่วนไม่ได้อยู่ใน ฉันสงสัยว่า Android ใช้userIdเป็น user_id ภายในสำหรับกระบวนการ

อย่างที่หลาย ๆ คนสังเกตว่าเราสามารถใช้appcompat:1.1.0หรือ1.0.2ขยายWebViewชั้นเรียนได้ ในอีมูเลเตอร์ 21 ที่ไม่มีบริการ Google Play สิ่งนี้WebViewจะขัดข้องเมื่อแตะป้ายข้อความเป็นเวลานาน แต่ในอุปกรณ์ทั่วไปทุกอย่างไม่เป็นไร


0

แทนที่จะเปลี่ยนเวอร์ชันของการอ้างอิงใด ๆ ฉันใช้การสร้าง webView โดยใช้โปรแกรมเป็นโซลูชัน

ปัญหาดูเหมือนเริ่มต้นด้วยการอ่านเค้าโครงจากไฟล์ xml ดังนั้นหากวิธีทางโปรแกรมเป็นวิธีแก้ปัญหาสำหรับคุณโปรดตรวจสอบตัวอย่างต่อไปนี้

private WebView generateWebView(){
    WebView wv = new WebView(YourContext);
    wv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    wv.setFitsSystemWindows(false); // your preferences
    wv.setVerticalScrollBarEnabled(false); // your preferences
    wv.setPadding(15,15,15,15); // your preferences
    return wv;
}

กว่าแค่เพิ่มเข้าไปในมุมมองหลักของคุณ:

LinearLayout scrollContainer = findViewById(R.id.scrollContainer);
scrollContainer.addView(generateWebView());

-4

ตรวจสอบเวอร์ชัน แอป Androidx และเวอร์ชันวัสดุของ Google ยังคงเหมือนเดิมเสมอ

implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation "androidx.cardview:cardview:1.0.0"

ใส่คำอธิบายภาพที่นี่


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