- Показать индикатор выполнения при запуске
- Загрузить мою веб-страницу
- Если страница загружается успешно, скройте индикатор выполнения и отобразите веб-просмотр.
- Если по какой-либо причине загрузка страницы не удалась, будет отображен AlertDialog с кнопками «Выход» и «Повторить». li>
Код: Выделить всё
import android.app.Activity
import android.app.AlertDialog
import android.content.Intent
import android.graphics.Bitmap
import android.view.View
import android.webkit.WebResourceError
import android.webkit.WebResourceRequest
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.ImageView
import android.widget.ProgressBar
class MyWebViewClient(
private val activity: Activity,
private val logoView: ImageView,
private val webView: WebView,
private val progressBar: ProgressBar,
private val headers: Map,
private val bounds: Array
) : WebViewClient() {
private var success: Boolean = true
override fun onPageFinished(view: WebView, url: String) {
webView.evaluateJavascript(
"adjustPadding(${bounds[0]}, ${bounds[1]}, ${bounds[2]}, ${bounds[3]})",
null
)
logoView.visibility = View.GONE
progressBar.visibility = View.GONE
webView.visibility = View.VISIBLE
Logger.log("onPageFinished()")
}
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
Logger.log("onPageStarted()")
success = true
progressBar.visibility = View.VISIBLE
super.onPageStarted(view, url, favicon)
}
override fun onReceivedError(
view: WebView?,
request: WebResourceRequest?,
error: WebResourceError?
) {
if (!request?.isForMainFrame!!) return
success = false
Logger.log("Page load error: " + error?.description.toString())
val builder: AlertDialog.Builder = AlertDialog.Builder(activity)
builder.setMessage(R.string.unable_connect_server)
builder.setNegativeButton(activity.getString(R.string.exit)) { dialogInterface, _ ->
dialogInterface.dismiss()
activity.finish()
}
builder.setPositiveButton(activity.getString(R.string.retry)) { dialogInterface, _ ->
dialogInterface.dismiss()
webView.reload()
}
builder.setCancelable(false)
builder.create().show()
webView.visibility = View.INVISIBLE
}
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
val url = request?.url.toString()
Logger.log("shouldOverrideUrlLoading(): $url")
if (url.startsWith(BuildConfig.SERVER_URL)) {
view?.loadUrl(url, headers)
} else {
activity.startActivity(Intent(Intent.ACTION_VIEW, request?.url))
}
return true
}
}
Код: Выделить всё
webView.settings.javaScriptEnabled = true
webView.settings.setSupportZoom(false)
if (BuildConfig.DEBUG) WebView.setWebContentsDebuggingEnabled(true)
webView.settings.userAgentString = USER_AGENT
webView.addJavascriptInterface(WebAppInterface(this), "App")
webView.webViewClient = MyWebViewClient(this, logoView, webView, progressBar, headers, bounds)
webView.webChromeClient = MyWebChromeClient(this)
webView.loadUrl(BuildConfig.SERVER_URL, headers)
В некоторых сообщениях в Интернете говорилось, что что эти обратные вызовы не будут вызываться, если URL-адрес не изменится. Обходные пути, которые я пробовал:
- Изменение URL-адреса путем добавления метки времени и случайной строки в качестве аргументов.
- Использование webView. loadUrl(webView.url) вместо webView.reload().
- Очистка кеша перед перезагрузкой с помощью webView.clearCache(true) .
Подробнее здесь: https://stackoverflow.com/questions/791 ... iew-reload