首先定义界面的activity_browser_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<LinearLayout
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:gravity="center_vertical">
<ImageView
android:id="@+id/toolbarBack"
android:layout_width="31.3dp"
android:layout_height="31.3dp"
android:layout_marginStart="18.3dp"
android:src="@drawable/ic_back_btn"/>
<TextView
android:id="@+id/selected_title"
android:layout_width="0dp"
android:layout_height="?actionBarSize"
android:layout_weight="1"
android:layout_marginEnd="50dp"
android:textStyle="bold"
android:singleLine="true"
android:gravity="center"
android:textColor="@color/black"
android:textSize="20sp"/>
</LinearLayout>
<ProgressBar
android:id="@+id/progressBar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:progressDrawable="@drawable/webview_progress_bar"
android:layout_width="match_parent"
android:layout_height="3dip"
android:max="100"
android:progress="0"
android:visibility="gone"/>
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
webview_progress_bar.xml用来自定义webView的加载进度条样式
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 进度条背景色 -->
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dip"/>
<solid android:color="#FFEDEDED" />
</shape>
</item>
<!-- 第1进度条 -->
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dip"/>
<solid android:color="#FFFF474F" />
</shape>
</clip>
</item>
</layer-list>
AndroidManifest的定义
<activity android:name=".ui.moment.BrowserActivity"
android:theme="@style/ActivityTransparent"
android:configChanges="orientation|screenSize"
android:hardwareAccelerated="true"
android:screenOrientation="portrait"
android:launchMode="singleTask"
android:process=":webView"/>
BrowserActivity
package com.test.ui.moment
import android.app.AlertDialog
import android.content.Context
import android.graphics.Bitmap
import android.os.Bundle
import android.util.Log
import android.view.KeyEvent
import android.view.View
import android.webkit.*
import android.widget.LinearLayout
import com.test.ui.BaseActivity
import com.test.utils.DeviceUtil
import org.jetbrains.anko.intentFor
import com.test.R
import com.test.utils.ToastUtil
import kotlinx.android.synthetic.main.activity_browser_layout.*
class BrowserActivity : BaseActivity(), View.OnClickListener {
companion object {
const val LOG_TAG = "test"
const val KEY_URL = "url"
fun startActivity(context: Context, url: String) {
val intent = context.intentFor<BrowserActivity>()
intent.putExtra(KEY_URL, url)
context.startActivity(intent)
Log.i(LOG_TAG,"BrowserActivity startActivity url: $url")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_browser_layout)
val layoutParams = toolbar.layoutParams as LinearLayout.LayoutParams
layoutParams.topMargin = DeviceUtil.statusBarHeight
val url = intent.getStringExtra(KEY_URL)
Log.i(LOG_TAG,"BrowserActivity onCreate loadUrl: $url")
webView.loadUrl(url)
setupWebView()
toolbarBack.setOnClickListener(this)
}
/**
* webView的设置
*/
private fun setupWebView() {
webView.addJavascriptInterface(this,"android") // 添加js监听 这样html就能调用客户端
webView.webChromeClient = webChromeClient
webView.webViewClient = webViewClient
var webSettings = webView.settings
webSettings.javaScriptEnabled = true // 允许使用js
webSettings.cacheMode = WebSettings.LOAD_NO_CACHE // 不使用缓存,只从网络获取数据.
webSettings.setSupportZoom(true) // 支持屏幕缩放
webSettings.builtInZoomControls = true
webSettings.displayZoomControls = false // 不显示webview缩放按钮
}
// WebViewClient主要帮助WebView处理各种通知、请求事件
private var webViewClient = object: WebViewClient(){
override fun onPageFinished(view: WebView?, url: String?) { // 页面加载完成
progressBar.visibility = View.GONE
Log.i(LOG_TAG,"BrowserActivity onPageFinished: $url")
}
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { // 页面开始加载
progressBar.visibility = View.VISIBLE
Log.i(LOG_TAG,"BrowserActivity onPageStarted: $url")
}
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
Log.i(LOG_TAG,"BrowserActivity shouldOverrideUrlLoading: $url")
if (url == "http://www.google.com/") {
ToastUtil.show("国内不能访问google,拦截该url")
return true // 表示我已经处理过了
}
return super.shouldOverrideUrlLoading(view, url)
}
}
// WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等
private var webChromeClient = object: WebChromeClient() {
// 不支持js的alert弹窗,需要自己监听然后通过dialog弹窗
override fun onJsAlert(webView: WebView, url: String, message: String, result: JsResult): Boolean {
var localBuilder = AlertDialog.Builder(webView.context)
localBuilder.setMessage(message).setPositiveButton("确定",null)
localBuilder.setCancelable(false)
localBuilder.create().show()
//注意:
//必须要这一句代码:result.confirm()表示:
//处理结果为确定状态同时唤醒WebCore线程
//否则不能继续点击按钮
result.confirm()
Log.i(LOG_TAG,"BrowserActivity onJsAlert: $url")
return true
}
// 获取网页标题
override fun onReceivedTitle(view: WebView, title: String) {
super.onReceivedTitle(view, title)
selected_title.text = title
Log.i(LOG_TAG,"BrowserActivity onReceivedTitle: $title")
}
// 加载进度回调
override fun onProgressChanged(view: WebView, newProgress: Int) {
progressBar.progress = newProgress
Log.i(LOG_TAG,"BrowserActivity onProgressChanged: $newProgress")
}
}
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
Log.i(LOG_TAG,"BrowserActivity onKeyDown: $keyCode")
if (webView.canGoBack() && keyCode == KeyEvent.KEYCODE_BACK) { // 点击返回按钮的时候判断有没有上一页
webView.goBack() // goBack()表示返回webView的上一页面
return true
}
return super.onKeyDown(keyCode, event)
}
/**
* JS调用android的方法
* @param str
* @return
*/
@JavascriptInterface // 仍然必不可少
fun getClient(str: String){
Log.i(LOG_TAG,"BrowserActivity getClient: $str")
}
override fun onDestroy() {
super.onDestroy()
//释放资源
webView.destroy()
}
override fun onBackPressed() {
finish()
super.onBackPressed()
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.toolbarBack -> {
finish()
}
}
}
}
调用代码:
BrowserActivity.startActivity(view.context, "https://www.qq.com/")