android.view.InflateException Lỗi thổi phồng lớp android.webkit.WebView


130

Trong Lollipop (API 22) mỗi khi trong ứng dụng của tôi, tôi hiển thị chế độ xem web ứng dụng bị treo. Tôi gặp nhiều sự cố trong bảng điều khiển dành cho nhà phát triển Android của mình liên quan đến sự kiện này.

Không cần phải nói rằng nó hoạt động trên Android 4, 6 và 7.

Đọc dấu vết ngăn xếp (được đăng ở cuối bài đăng này), có điều gì đó khiến tôi khó chịu

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

Tôi đã tìm kiếm trong R.java được tạo mà không gặp may mắn, rõ ràng là vì ID không tồn tại, nhưng nó đáng để thử.

Googling xung quanh vấn đề dường như liên quan đến cách lollipop xử lý chế độ xem web. Tôi đã bắt đầu một AVD mới với kẹo mút dựa trên một thiết bị mà tôi tìm thấy trên trình báo cáo sự cố trong GDC và tôi có thể tái tạo sự cố.


Theo dõi toàn bộ ngăn xếp:

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) 

Điều này có vẻ như một sự WebViewcố hệ thống . Tôi không biết nếu / khi nào trình giả lập nhận được bản cập nhật cho điều đó. Bạn đã thử trên phần cứng chưa?
CommonsWare

@commonsware không Tôi hiện không có bất kỳ thiết bị nào có kẹo mút. Nhưng báo cáo sự cố đang hiển thị nhiều mục cho điều này.
Valerio

18
Câu hỏi này có từ năm 2016 nhưng vấn đề này lại xuất hiện vào cuối năm 2019. Nếu bạn đến đây từ một tìm kiếm trên web, hãy đảm bảo chọn câu trả lời phù hợp với bạn.
user1032613 30/09/19

Tôi không có thiết bị vật lý cấp API 21. Tôi đã thử chạy ứng dụng trên trình giả lập Genymotion và Android với API cấp 21 nhưng nó bị lỗi! Bất cứ ai ở đây cho tôi biết liệu nó có hoạt động trên Thiết bị vật lý hay không! Bây giờ ứng dụng của tôi đang gặp rủi ro!
Sumit Shukla

Đối với tôi, Google Play đã báo cáo sự cố trên Huawei P8 Lite chạy Android 5.0 nhưng nó không xuất hiện trên Samsung Note 4 thực chạy Android 6.0.1 hoặc máy tính bảng Samsung Note 8 chạy Android 4.4.2.
FractalBob

Câu trả lời:


168

Nếu bạn sử dụng androidx.appcompat:appcompat:1.1.0, hãy thử androidx.appcompat:appcompat:1.0.2thay thế. có vẻ như điều 1.1.0đó không sửa được lỗi WebViewtrong Android 5.1.1.

Bản cập nhật tháng 2 năm 2020: Hoàn nguyên để 1.0.2ngừng hoạt động đối với nhiều người (bao gồm cả ứng dụng của tôi), nhưng việc sử dụng phiên bản hiện tại của androidx.appcompat:appcompat:1.2.0-alpha02đã khắc phục được sự cố. (Tôi đã thấy nó trên Huawei P8 Lite chạy Android 5.0 trong quá trình kiểm tra "Báo cáo trước khi ra mắt" tự động của Google).

Bản cập nhật tháng 6 năm 2020: Có sẵn các bản phát hành mới hơn bản được đề cập trong bản cập nhật tháng 2 năm 2020, bạn có thể xem các phiên bản hiện có tại đây:


3
Có bản sửa lỗi để giữ 1.1.0 và sửa lỗi này không? Chúng tôi phụ thuộc vào một số thứ không có trong 1.0.2 và có vẻ như một số phiên bản alpha hoặc beta của 1.1.0 không có lỗi này.
PampaZiya

3
Có một sự cố định sạch sẽ cảm ơn bạn! Tôi đang sử dụng bản beta01 và mọi thứ có vẻ ổn. Tôi sẽ tiếp tục sử dụng nó vì dù sao thì không có lợi ích rõ ràng nào của việc sử dụng 1.1.0.
PampaZiya

11
Có một vấn đề liên quan đến việc lấy lại này: Issuetracker.google.com/issues/141132133
Brais Gabin

3
Như hôm nay, việc hạ cấp nó không hoạt động, trong trường hợp của tôi, giải pháp này từ Issuetracker.google.com/issues/141132133 hoạt động: "Có thể cách đơn giản nhất để giải quyết vấn đề này là buộc Gradle đặt phiên bản thành 1.1.0- rc01. Thêm cái này vào tệp gradle của bạn. configurations.all {ResolutionStrategy {force 'androidx.appcompat: appcompat: 1.1.0-rc01'}} "
Talu

3
androidx.appcompat:appcompat:1.2.0-alpha03cũng hoạt động
Artyom

45

Cảnh báo: cách giải quyết này cũng có thể phá vỡ một số điều; xem các bình luận để biết chi tiết

Nếu bạn muốn mở rộng WebView từ một bố cục XML, bạn có thể bọc nó trong một lớp con nhỏ đẹp (dựa trên câu trả lời của 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());
    }
}

CHỈNH SỬA: giờ thậm chí còn đẹp hơn với Kotlin

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

1
Tôi tìm thấy cùng một vấn đề và sử dụng giải pháp này để sửa chữa nó, cảm ơn bạn
itsa04g9

Cập nhật Android WebView trên thiết bị cũng khắc phục được sự cố
tên hiển thị

2
Vẫn là một vấn đề trong năm 2019 và nó hoạt động, nhưng tôi không biết tại sao / làm thế nào, sẽ tốt nếu điều này được giải thích. Ngoài ra, tôi nhận được cảnh báo Không bao giờ được sử dụng trên phương thức khởi tạo thứ 4 "public LollipopFixedWebView (Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
David

4
Chỉ cần một lời cảnh báo về cách giải quyết này: việc khởi tạo WebView với Ngữ cảnh trống có thể dẫn đến các tác dụng phụ không mong muốn. Ví dụ: các ActionModes từ WebView có thể sẽ không hoạt động nữa (tức là nhấn và giữ để đánh dấu văn bản).
Dmitry Brant

5
Như @DmitryBrant đã nói, hãy rất cẩn thận khi thực hiện điều này vì điều này phá vỡ một số thứ, bao gồm các trường thả xuốngnhấn và giữ để đánh dấu văn bản !
user5507535

42

Nếu bạn đang sử dụng androidx.appcompat:appcompat:1.1.0và không muốn hạ cấp xuống androidx.appcompat:appcompat:1.0.2hoặc nâng cấp lên androidx.appcompat:appcompat:1.2.0-alpha03, có một giải pháp khác được mô tả trong nhận xét này trên Trình theo dõi vấn đề của Google.

Tôi nhận thấy rằng sau khi gọi applyOverrideConfiguration Context.getAssets()Context.getResources().getAssets()không trả về cùng một đối tượng AssetManager. AssetManager được trả về Context.getAssets()không thể truy cập tài nguyên trong các gói khác (bao gồm cả gói WebView hệ thống), khiến WebView gặp sự cố. Nếu tôi ghi đè Context.getAssets()để quay lại getResources().getAssets(), sự cố đã biến mất.

Dựa trên nhận xét đó, bạn có thể ghi đè getAssets()Hoạt động của WebView để nó quay lại getResources().getAssets()thay thế để giải quyết vấn đề.

Java

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

Kotlin

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

3
Câu trả lời tuyệt vời +1
Shirane85

Xin chào, nếu điều này là đúng, điều này sẽ được khắc phục như thế nào với bản phát hành appCompact không liên quan đến AssetManager và bản thân webview?
Sinapse

Nhìn vào danh sách thay đổi này, có vẻ như một số phiên bản applyOverrideConfigurationwebview đang gặp sự cố với các lệnh gọi bên trong thư viện AppCompat.
Prawira

34

lời khuyên của tôi là chỉ sử dụng tùy chỉnh / mới Configurationkhi "bản gốc" gây ra sự cố, vì vậy chỉ trên Lollipop. Mã @SpaceBizon hoạt động tốt cho đến Android 8.x, trên 9 và Q (hiện tại là beta) mỗi lần nhấn chọn / thả xuống sẽ không hiển thị bộ AlertDialogchọn, thay vào đó là lỗi rò rỉ bộ nhớ xảy ra ... bên dưới getFixedContextphương pháp đã sửa với mã phiên bản phù hợp "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

Nếu bạn đang sử dụng androidx.appcompat: appcompat: 1.1.0, hãy thay đổi thành androidx.appcompat: appcompat: 1.0.2 hoặc nếu bạn muốn sử dụng Chủ đề DayNight, hãy ghi đè applyOverrideConfiguration trong hoạt động của bạn như sau. (Lưu ý: Thao tác này yêu cầu khởi động lại ứng dụng trong khi chuyển từ Chủ đề tối sang Chủ đề sáng và ngược lại).

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

Cách giải quyết này hoạt động, nhưng không nên 21..22thay vì 21..25? Sự cố dường như không xảy ra trong API 23+.
Dmitry Brant

5
Đây là bản sửa đổi gây ra sự cố này - android.googlesource.com/platform/frameworks/support/+/… . Vì vậy, theo mã, sự cố sẽ xảy ra trong API 21..25 ​​trên các thiết bị chưa cài đặt Cửa hàng Google Play và Phiên bản Android Webview <50.
AR Mythili Saran

Hạ cấp xuống androidx.appcompat: appcompat: 1.0.2 thực hiện thủ thuật, cảm ơn
Talu

3
Cách giải quyết của tôi trong java có vẻ phù hợp với tôi là như thế này (xin lỗi vì định dạng khủng khiếp nhưng đó không phải là một câu trả lời mới chỉ là một cổng):@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
Mike Hardy

@ARMythiliSaran tại sao bạn lại nói rằng điều này chỉ xảy ra ở "các thiết bị chưa cài đặt Cửa hàng Google Play và Phiên bản Android Webview <50"?
andrei

20

Nếu bạn không dựa vào chuyển đổi chủ đề DayNight (hoặc các sự kiện UiMode khác), bạn có thể thêm android: configChanges = "uiMode" vào tệp kê khai hoạt động webview để ngăn AppCompatDelegate cập nhật cấu hình Tài nguyên và do đó làm rối loạn lạm phát chế độ xem web.


Điều này đã làm việc cho tôi. Tôi cần ConstraintLayout 1.1.3, yêu cầu appcompat 1.1.0, vì vậy hoàn nguyên không phải là một tùy chọn.
Matt Robertson

Hạ cấp xuống 1.0.2 không có gì khác biệt đối với tôi, nhưng phương pháp này đã hoạt động.
chrisbtoo

giải pháp tuyệt vời!
bojan

17

Hãy thử sử dụng để tạo chế độ xem web:

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

và tệp xml của tôi?
Acauã Pitta

Điều này đã giải quyết được vấn đề của tôi mà không cần hạ cấp bất kỳ phiên bản thư viện nào
Lỗi xảy ra vào

10

Và một người nữa cố gắng khắc phục sự cố. Nên ghi đè phương thức này trong hoạt động của bạn:

    @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

Tôi đã có thể tạo lại sự cố trên API 21 trong trình mô phỏng.

Vì vậy, tôi đã cố gắng thêm điều này vào triển khai, như được mô tả trong tài liệu :

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"
}

Thêm appcompat-resourcesđã không khắc phục vấn đề.

Có thể sẽ có một phiên bản trong tương lai, nhưng tôi muốn đề cập rằng dường như có một thư viện tài nguyên bổ sung được cho là để giải quyết vấn đề này. Vì vậy, khi cố gắng khắc phục điều này với một phiên bản mới appcompat, hãy thêm appcompat-resourcesthư viện có cùng phiên bản đó.

Hoàn nguyên để androidx.appcompat:appcompat:1.0.2khắc phục sự cố như một giải pháp thay thế.


Tôi không thể hoàn nguyên "androidx.appcompat:appcompat-resources:$appcompat_version"về phiên bản 1.0.2. "LỖI: Không giải quyết được: androidx.appcompat: appcompat-resources: 1.0.2"
Murillo Comino

appcompat-resources không có sẵn cho 1.0.2. Xem câu trả lời cập nhật của tôi.
Manuel

Cảm ơn bạn rất nhiều, nó đã làm việc. Tôi hy vọng rằng trong các phiên bản tương lai giải quyết được điều này.
Murillo Comino

5

Đoạn mã dưới đây sẽ khắc phục sự cố. Vui lòng thêm nó vào Activity:

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

3

Chỉ là một lưu ý nhỏ, tôi đã phải vật lộn trong một thời gian mặc dù tôi đã hạ cấp xuống 1.0.2, chỉ vì tôi dường như có sự phụ thuộc bắc cầu vào appcompat: 1.1.0 thông qua androidx.constraintlayout: bindlayout: 2.0.0-beta3. Sau khi tôi hạ cấp nó xuống thành ràng buộc: 1.1.3 mọi thứ hoạt động tốt

(Theo https://issuetracker.google.com/issues/141351441, sự cố sẽ sớm được khắc phục với appcompat: 1.2.0-alpha02)


3

Tôi đã sử dụng phiên bản mới nhất từ nguồn này . Vui lòng kiểm tra và sử dụng của riêng bạn dựa trên những gì bạn cho là tốt nhất.

Trong trường hợp bạn muốn bỏ qua, cách triển khai dưới đây sẽ giải quyết được vấn đề:

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

2

戴 文锦 cũng phù hợp với tôi. Nhưng chỉ hạ cấp androidx.appcompat: appcompat: 1.1.0 xuống 1.0.2 đã không thành công.

Tôi đã hạ cấp tất cả các phiên bản androidx đã nâng cấp trước đây của mình từ

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'

Quay lại

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'

Xin nhắc lại rằng mã của Google cho đến nay không có lỗi và đã được thử nghiệm tốt và ai đó không nên nâng cấp phiên bản một cách dễ dàng.


Bạn đã hạ cấp androidx.appcompat: appcompat xuống 1.1.0-rc01? Không đến 1.0.2?
Zhebzhik Babich 27/09/19

Đã thử nó với 1.0.2 nhưng không thành công. Phải là một trong những phần phụ thuộc khác kết hợp với appcompat.
S. Gissel

Đơn giản chỉ cần hạ cấp androidx.appcompat:appcompatđã làm việc cho tôi. Đối với người đọc trong tương lai: hãy đảm bảo "đồng bộ hóa dần dần" và xác nhận rằng nó không đủ cho bạn, trước khi hạ cấp thêm nội dung khác.
user1032613 30/09/19

Sau khi hạ nó sẽ không được thừa để kiểm tra các phiên bản phụ thuộc vào dự án 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 đăng đoạn mã đã giúp chúng tôi giải quyết vấn đề. Nhưng hãy đảm bảo rằng bạn thực hiện điều này đầu tiên stackoverflow.com/a/57715955/2344192
tên hiển thị

2
Hãy cẩn thận, cách giải quyết này sẽ chia nhỏ các trường và chọn văn bản trong WebView.
user5507535

2

AppCompat 1.2.0-alpha02 đã được phát hành hôm nay, vì vậy bạn có thể sử dụng

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

sẽ khắc phục sự cố WebView trên Lollipop.


nó khắc phục sự cố nhưng vì nó là phiên bản alpha nên nó có thể gây ra các lỗi khác. nếu bạn đã thử nó, bạn có gặp phải vấn đề nào khác trong ứng dụng của mình không?
Soheil

@Soheil Không, tôi chưa gặp bất kỳ trục trặc nào. Tất nhiên, các phiên bản Alpha luôn có một chút rủi ro. Ví dụ: một lỗi cho alpha02 được đề cập ở đây: Issuetracker.google.com/issues/141351441#comment48
Dimitris Pattas

2

Tôi có thể tạo lại sự cố này trên Nexus 7 API 22. Sự cố được khắc phục bằng cách cập nhật phiên bản WebView hệ thống Android của máy tính bảng từ phiên bản 39 (2237560-arm) lên phiên bản 79.0.3945.136

Việc này không nằm trong quyền kiểm soát của tôi đối với người dùng, nhưng đó là một giải pháp nếu bạn cần giúp ai đó sử dụng ứng dụng của mình ngay lập tức.


1

Vấn đề đã được giải quyết cho tôi bằng cách hạ cấp xuống triển khai 'androidx.appcompat: appcompat: 1.0.2'


1

Trong trường hợp của tôi, một vấn đề nằm trong phương pháp

fun getUserId(): Int = userId

của một MainActivity. Tôi không biết tại sao nó lại ảnh hưởng WebView. getUserId()không bị ghi đè, cũng không phải là phương thức công khai của Activitylớp. Nếu tôi đổi tên hoặc xóa phương thức này, nó sẽ WebViewbắt đầu mở. Cũng đang cố gắng thay đổi

private var userId: Int = 0

đến

var userId: Int = 0
    private set

dẫn đến cùng một ngoại lệ. Tôi hiểu rằng khi đã nhìn thấy một ngoại lệ: 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. Trong trường hợp đó user = 123456 trên thực tế là người dùng được ủy quyền của tôi, được sử dụng trong một số yêu cầu, không phải trong WebView. Tôi nghi ngờ Android sử dụng userIdlàm user_id cục bộ cho các quy trình của nó.

Như nhiều người khác nhận thấy, chúng tôi có thể sử dụng appcompat:1.1.0hoặc 1.0.2và mở rộng WebViewlớp học. Trong trình giả lập 21 không có Dịch vụ của Google Play, điều này WebViewsẽ gặp sự cố khi chạm lâu vào các nhãn văn bản, nhưng trên các thiết bị thông thường thì mọi thứ đều ổn.


0

Thay vì thay đổi phiên bản của bất kỳ phụ thuộc nào, tôi đã triển khai tạo webView theo chương trình như một giải pháp.

Vấn đề thực sự giống như bắt đầu với việc đọc bố cục từ tệp xml. Vì vậy, nếu cách lập trình là giải pháp áp dụng cho bạn, vui lòng kiểm tra mẫu dưới đây.

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;
}

Hơn là chỉ thêm vào chế độ xem cha mẹ của bạn:

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

-4

Kiểm tra phiên bản. Ứng dụng Androidx và phiên bản material của Google luôn giống nhau.

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"

nhập mô tả hình ảnh ở đây


1
Bạn nên dán mã ví dụ trực tiếp vào câu trả lời của mình trong trường hợp sau này hình ảnh bạn liên kết không có sẵn.
Louis Charette
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.