Masalahnya adalah kinerja setelah rotasi. WebView harus memuat ulang halaman, yang bisa sedikit membosankan.
Apa cara terbaik menangani perubahan orientasi tanpa memuat ulang halaman dari sumber setiap kali?
android
webview
orientation
glennanthonyb
sumber
sumber
Jawaban:
Jika Anda tidak ingin WebView memuat ulang pada perubahan orientasi cukup timpa onConfigurationChanged di kelas Aktivitas Anda:
Dan atur atribut android: configChanges di manifes:
untuk info lebih lanjut, lihat:
http://developer.android.com/guide/topics/resources/runtime-changes.html#MenanganiTheChange
https://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges
sumber
configChanges
atribut ditambahkan ke subclass Activity 2) Jika aplikasi Anda bergantung pada beberapa proyek,configChanges
atribut akan ditambahkan ke manifes yang ada di di atas pohon dependensi (yang mungkin bukan proyek yang mengandung kelas Activity).onConfigurationChanged
metode override tidak berguna.Sunting: Metode ini tidak lagi berfungsi sebagaimana dinyatakan dalam dokumen
Jawaban asli:
Ini dapat ditangani dengan menulis ulang
onSaveInstanceState(Bundle outState)
dalam aktivitas Anda dan meneleponsaveState
dari tampilan web:Kemudian pulihkan ini di onCreate Anda setelah tampilan web dipompa kembali tentu saja:
sumber
Jawaban terbaik untuk ini adalah mengikuti dokumentasi Android yang ditemukan di sini. Pada dasarnya ini akan mencegah Webview dari reload:
Secara opsional , Anda dapat memperbaiki anomali (jika ada) dengan mengesampingkan
onConfigurationChanged
dalam aktivitas:sumber
Saya sudah mencoba menggunakan onRetainNonConfigurationInstance (mengembalikan WebView ), kemudian mendapatkannya kembali dengan getLastNonConfigurationInstance selama onCreate dan menetapkan ulang.
Sepertinya belum berfungsi. Saya tidak dapat membantu tetapi berpikir saya benar-benar dekat! Sejauh ini, saya hanya mendapatkan WebView kosong / latar belakang putih sebagai gantinya. Posting di sini dengan harapan bahwa seseorang dapat membantu mendorong yang ini melewati garis finish.
Mungkin saya seharusnya tidak melewati WebView . Mungkin objek dari dalam WebView ?
Metode lain yang saya coba - bukan favorit saya - adalah mengaturnya di aktivitas:
... dan kemudian tidak melakukan apa-apa di sini:
ITU bekerja, tetapi itu mungkin tidak dianggap sebagai praktik terbaik .
Sementara itu, saya juga memiliki ImageView tunggal yang ingin saya perbarui secara otomatis tergantung pada rotasi. Ini ternyata sangat mudah. Di bawah
res
folder saya , saya memilikidrawable-land
dandrawable-port
menahan variasi lanskap / potret, kemudian saya gunakanR.drawable.myimagename
untuk sumber ImageView dan Android "melakukan hal yang benar" - yay!... kecuali ketika Anda melihat perubahan konfigurasi, maka tidak. :(
Jadi saya berselisih. Gunakan onRetainNonConfigurationInstance dan rotasi ImageView berfungsi, tetapi kegigihan WebView tidak ... atau gunakan onConfigurationChanged dan WebView tetap stabil, tetapi ImageView tidak memperbarui. Apa yang harus dilakukan?
Satu catatan terakhir: Dalam kasus saya, memaksakan orientasi bukanlah kompromi yang dapat diterima. Kami benar-benar ingin mendukung rotasi dengan anggun. Agak suka bagaimana aplikasi Browser Android tidak! ;)
sumber
Salah satu kompromi adalah menghindari rotasi. Tambahkan ini untuk memperbaiki aktivitas hanya untuk orientasi Potret.
sumber
Cara terbaik untuk menangani perubahan orientasi dan Mencegah pemuatan ulang WebView di Rotate.
Dengan mengingat hal itu, untuk mencegah onCreate () dipanggil setiap kali Anda mengubah orientasi, Anda harus menambahkan
android:configChanges="orientation|screenSize" to the AndroidManifest.
atau hanya ..
sumber
Cukup tulis baris kode berikut dalam file Manifest Anda - tidak ada yang lain. Ini benar-benar berfungsi:
sumber
Saya menghargai ini agak terlambat, namun ini adalah jawaban yang saya gunakan ketika mengembangkan solusi saya:
AndroidManifest.xml
WebClient.java
sumber
Anda dapat mencoba menggunakan
onSaveInstanceState()
danonRestoreInstanceState()
pada Aktivitas Anda untuk memanggilsaveState(...)
danrestoreState(...)
pada contoh WebView Anda.sumber
Ini tahun 2015, dan banyak orang mencari solusi yang masih dapat digunakan pada ponsel Jellybean, KK dan Lollipop. Setelah banyak kesulitan saya menemukan cara untuk mempertahankan tampilan web utuh setelah Anda mengubah orientasi. Strategi saya pada dasarnya adalah untuk menyimpan tampilan web dalam variabel statis yang terpisah di kelas lain. Kemudian, jika rotasi terjadi, saya melepaskan tampilan web dari aktivitas, menunggu orientasi selesai, dan pasang kembali tampilan web kembali ke aktivitas. Misalnya ... pertama-tama letakkan ini di MANIFEST Anda (keyboardHidden dan keyboard adalah opsional):
Dalam KELAS APLIKASI TERPISAH, masukkan:
Dalam ACTIVITY cantumkan:
Akhirnya, XML sederhana:
Ada beberapa hal yang dapat ditingkatkan dalam solusi saya, tetapi saya sudah menghabiskan banyak waktu, misalnya: cara yang lebih singkat untuk memvalidasi jika Kegiatan telah diluncurkan untuk pertama kalinya alih-alih menggunakan penyimpanan SharedPreferences. Pendekatan ini menjaga Anda tetap utuh tampilan web (afaik), kotak teks, label, UI, variabel javascript, dan negara navigasi yang tidak tercermin oleh url.
sumber
Satu-satunya hal yang harus Anda lakukan adalah menambahkan kode ini ke file manifes Anda:
sumber
Pembaruan: strategi saat ini adalah untuk memindahkan instance WebView ke kelas Aplikasi alih-alih dipertahankan fragmen ketika dilepaskan dan pasang kembali pada resume seperti yang dilakukan Josh. Untuk mencegah aplikasi menutup, Anda harus menggunakan layanan latar depan, jika Anda ingin mempertahankan status ketika pengguna beralih di antara aplikasi.
Jika Anda menggunakan fragmen, Anda bisa menggunakan instance retensi dari WebView. Tampilan web akan dipertahankan sebagai anggota kelas contoh. Namun Anda harus melampirkan tampilan web di OnCreateView dan lepaskan sebelum OnDestroyView untuk mencegahnya rusak dengan wadah induk.Kredit PS pergi ke jawaban kcoppockAdapun 'SaveState ()' tidak lagi berfungsi sesuai dengan dokumentasi resmi :
sumber
setRetainInstance
mempertahankan Fragmen tampilan (dan karenanya WebView) masih dihancurkan.Metode ini dapat ditimpa pada aktivitas apa pun, itu hanya pada dasarnya memungkinkan Anda untuk menyimpan dan mengembalikan nilai setiap kali aktivitas dibuat / dihancurkan, ketika orientasi layar mengubah aktivitas akan dihancurkan dan diciptakan kembali di latar belakang, sehingga Anda dapat menggunakan metode ini untuk menyimpan sementara / mengembalikan negara selama perubahan.
Anda harus melihat lebih dalam pada dua metode berikut dan melihat apakah itu cocok dengan solusi Anda.
http://developer.android.com/reference/android/app/Activity.html
sumber
Solusi terbaik yang saya temukan untuk melakukan ini tanpa membocorkan
Activity
referensi sebelumnya dan tanpa mengaturconfigChanges
.. adalah dengan menggunakan MutableContextWrapper .Saya telah menerapkan ini di sini: https://github.com/slightfoot/android-web-wrapper/blob/48cb3c48c457d889fc16b4e3eba1c9e925f42cfb/WebWrapper/src/com/example/webwrapper/BrowserActivity.java
sumber
Ini adalah satu-satunya hal yang bekerja untuk saya (saya bahkan menggunakan save instance state
onCreateView
tetapi tidak bisa diandalkan).Saya membuat pemegang Singleton untuk status WebView. Keadaan dipertahankan selama proses aplikasi ada.
EDIT: Itu
loadDataWithBaseURL
tidak perlu, itu berfungsi dengan baik hanya denganMeskipun saya membaca ini tidak selalu berhasil dengan cookie.
sumber
coba ini
sumber
Halaman ini menyelesaikan masalah saya, tetapi saya harus membuat sedikit perubahan di awal:
Bagian ini memiliki sedikit masalah bagi saya ini. Pada perubahan orientasi kedua aplikasi diakhiri dengan null pointer
menggunakan ini bekerja untuk saya:
sumber
Anda harus mencoba ini:
onServiceConnected
metode ini, dapatkan WebView dan panggilsetContentView
metode tersebut untuk merender WebView Anda.Saya mengujinya dan berfungsi tetapi tidak dengan WebViews lain seperti XWalkView atau GeckoView.
sumber
sumber
Saya suka solusi ini http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/
Menurutnya kami menggunakan kembali contoh WebView yang sama. Memungkinkan untuk menyimpan riwayat navigasi dan menggulir posisi pada perubahan konfigurasi.
sumber