android webView使用

首先定义界面的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/")

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值