Di Lollipop (API 22) setiap kali di aplikasi saya, saya menampilkan tampilan web, aplikasi tersebut macet. Saya mengalami beberapa kerusakan di konsol pengembang android saya terkait dengan acara ini.
Tidak perlu dikatakan bahwa ini berfungsi di Android 4, 6, dan 7.
Membaca jejak tumpukan (diposting di akhir posting ini), ada sesuatu yang mengganggu saya
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040003
Saya mencari di R.java yang dihasilkan tanpa hasil, jelas karena ID tidak ada, tetapi patut dicoba.
Mencari-cari masalah di Google tampaknya terkait dengan cara lollipop menangani tampilan web. Saya memulai AVD baru dengan lollipop berdasarkan perangkat yang saya temukan di pelapor kerusakan di GDC, dan saya dapat mereproduksi masalahnya.
Jejak tumpukan penuh:
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
masalah sistem . Saya tidak tahu apakah / kapan emulator mendapatkan pembaruan untuk itu. Sudahkah Anda mencoba perangkat keras?Jawaban:
Jika Anda menggunakan
androidx.appcompat:appcompat:1.1.0
, cobaandroidx.appcompat:appcompat:1.0.2
saja. tampaknya itu1.1.0
tidak memperbaiki bugWebView
di Android5.1.1
.Pembaruan Feb-2020: Kembali
1.0.2
berhenti bekerja untuk banyak orang (termasuk aplikasi saya), tetapi menggunakan versi saatandroidx.appcompat:appcompat:1.2.0-alpha02
ini memperbaiki kerusakan. (Saya melihatnya di Huawei P8 Lite yang menjalankan Android 5.0 selama pengujian "Laporan pra-peluncuran" otomatis Google).Pembaruan Juni-2020: Ada rilis yang lebih baru tersedia daripada yang disebutkan dalam pembaruan Feb-2020, Anda dapat melihat versi yang saat ini tersedia di sini:
sumber
androidx.appcompat:appcompat:1.2.0-alpha03
bekerja jugaPeringatan: solusi ini mungkin juga merusak beberapa hal; lihat komentar untuk detailnya
Jika Anda ingin memekarkan WebView dari tata letak XML, Anda dapat membungkusnya dalam subkelas kecil yang bagus (berdasarkan jawaban ikostet ):
EDIT: sekarang lebih bagus dengan Kotlin
sumber
Jika Anda menggunakan
androidx.appcompat:appcompat:1.1.0
dan tidak ingin menurunkanandroidx.appcompat:appcompat:1.0.2
atau meningkatkan keandroidx.appcompat:appcompat:1.2.0-alpha03
, ada solusi lain yang dijelaskan dalam komentar ini di Google Issue Tracker.Berdasarkan komentar tersebut, Anda bisa mengganti
getAssets()
di Aktivitas WebView sehingga ia kembaligetResources().getAssets()
untuk menyelesaikan masalah.Jawa
Kotlin
sumber
applyOverrideConfiguration
panggilan di dalam pustaka AppCompat.saran saya adalah gunakan custom / new
Configuration
hanya jika "original one" menyebabkan masalah, begitu juga Lollipop saja. Kode @SpaceBizon berfungsi dengan baik hingga Android 8.x, pada 9 dan Q (saat ini beta) setiap tekan pilih / tarik-turun tidak akan menampilkan alatAlertDialog
pilih, alih-alih terjadi kebocoran memori ... di bawahgetFixedContext
metode tetap dengan kode versi yang sesuai "iffed"sumber
Jika Anda menggunakan androidx.appcompat: appcompat: 1.1.0, ubah ke androidx.appcompat: appcompat: 1.0.2 atau jika Anda ingin menggunakan Tema DayNight, ganti applyOverrideConfiguration dalam aktivitas Anda sebagai berikut. (Catatan: Ini memerlukan aplikasi dimulai ulang saat beralih dari Tema Gelap ke Tema Terang dan sebaliknya).
sumber
21..22
, bukan21..25
? Masalahnya sepertinya tidak terjadi di API 23+.@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
Jika Anda tidak mengandalkan peralihan tema DayNight (atau peristiwa UiMode lainnya), Anda dapat menambahkan android: configChanges = "uiMode" ke manifes aktivitas webview untuk mencegah AppCompatDelegate memperbarui konfigurasi Sumber Daya dan dengan demikian mengacaukan inflasi tampilan web.
sumber
Coba gunakan untuk membuat tampilan web:
sumber
Dan sekali lagi mencoba memperbaiki masalah. Harus mengganti metode ini dalam aktivitas Anda:
sumber
Saya dapat mereproduksi error pada API 21 di emulator.
Jadi saya mencoba menambahkan ini ke implementasi, seperti yang dijelaskan di dokumen :
Menambahkan
appcompat-resources
itu tidak memperbaiki masalah.Mungkin versi yang akan datang akan, tetapi saya ingin menyebutkan bahwa tampaknya ada pustaka sumber daya pelengkap yang seharusnya menangani masalah ini. Jadi ketika mencoba untuk memperbaikinya dengan versi baru
appcompat
, tambahkanappcompat-resources
pustaka dengan versi yang sama.Mengembalikan ke
androidx.appcompat:appcompat:1.0.2
memang memperbaiki masalah sebagai solusi.sumber
"androidx.appcompat:appcompat-resources:$appcompat_version"
ke versi 1.0.2. "ERROR: Gagal menyelesaikan: androidx.appcompat: appcompat-resources: 1.0.2"Kode di bawah ini akan memperbaiki masalah. Harap tambahkan di
Activity
:sumber
Sekadar catatan, saya berjuang beberapa saat meskipun saya menurunkan versinya ke 1.0.2, hanya karena saya sepertinya memiliki ketergantungan transitif ke appcompat: 1.1.0 melalui androidx.constraintlayout: constraintlayout: 2.0.0-beta3. Setelah saya menurunkannya ke constraintlayout: 1.1.3 semuanya bekerja dengan baik
(Menurut https://issuetracker.google.com/issues/141351441 masalah akan segera diperbaiki dengan appcompat: 1.2.0-alpha02)
sumber
Saya menggunakan versi terbaru dari sumber ini . Silakan periksa dan gunakan milik Anda sendiri berdasarkan apa yang menurut Anda terbaik.
Jika Anda ingin melewati, penerapan di bawah ini menyelesaikan masalah:
sumber
戴 文锦 juga tepat untuk saya. Namun, mendowngrade hanya androidx.appcompat: appcompat: 1.1.0 ke 1.0.2 tidak berhasil.
Saya menurunkan semua versi Androidx saya yang sebelumnya ditingkatkan dari
kembali ke
Sebuah pengingat bahwa kode Google sejauh ini tidak bebas bug dan telah teruji dengan baik dan bahwa seseorang tidak boleh memutakhirkan versinya secara sembarangan.
sumber
androidx.appcompat:appcompat
berhasil untuk saya. Untuk pembaca selanjutnya: pastikan untuk "sinkronisasi gradle" dan mengonfirmasi bahwa itu tidak cukup untuk Anda, sebelum menurunkan versi lainnya.sumber
AppCompat 1.2.0-alpha02 dirilis hari ini, jadi Anda dapat menggunakan
yang akan memperbaiki masalah WebView di Lollipop.
sumber
Saya dapat mereproduksi masalah ini pada Nexus 7 API 22. Masalah ini diperbaiki dengan memperbarui versi Android System WebView dari versi 39 (2237560-arm) ke versi 79.0.3945.136
Ini tidak ada dalam kendali saya bagi pengguna untuk melakukan ini, tetapi ini adalah solusi jika Anda perlu membantu seseorang segera menggunakan aplikasi Anda.
sumber
Masalah ini diatasi untuk saya dengan menurunkan versi ke implementasi 'androidx.appcompat: appcompat: 1.0.2'
sumber
Dalam kasus saya, ada masalah dalam metode
dari MainActivity. Saya tidak tahu mengapa itu mempengaruhi
WebView
.getUserId()
tidak diganti, atau metode publikActivity
kelas. Jika saya mengganti nama atau menghapus metode ini,WebView
mulai terbuka. Juga mencoba untuk berubahuntuk
mengarah ke pengecualian yang sama. Saya mengerti bahwa ketika melihat pengecualian:
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
. Dalam hal ini pengguna = 123456 sebenarnya adalah pengguna resmi saya, yang digunakan dalam beberapa permintaan, bukan diWebView
. Saya menduga Android digunakanuserId
sebagai user_id lokal untuk prosesnya.Seperti yang diperhatikan banyak orang, kami dapat menggunakan
appcompat:1.1.0
atau1.0.2
dan memperluasWebView
kelas. Dalam emulator 21 tanpa Layanan Google Play, iniWebView
akan mogok saat menyentuh label teks lama, tetapi pada perangkat biasa semuanya baik-baik saja.sumber
Alih-alih mengubah versi dependensi apa pun, saya menerapkan pembuatan webView secara terprogram sebagai solusi.
Masalahnya sebenarnya terlihat seperti memulai dengan membaca layout dari file xml. Jadi jika cara terprogram adalah solusi yang dapat diterapkan untuk Anda, silakan periksa contoh di bawah ini.
Dari sekedar menambahkan ke tampilan orang tua Anda:
sumber
Periksa versi. Androidx appcompat dan versi material Google selalu sama.
masukkan deskripsi gambar di sini
sumber