(kotlin)Android webView工具封装

Android 开发中,封装一个 WebView 工具类可以简化代码,提高复用性,并统一处理 WebView 的常见配置和逻辑。以下是一个封装好的 WebView 工具类示例,支持加载 HTML 内容远程 URL显示加载进度处理返回键等功能。

WebView 工具类封装

import android.content.Context
import android.util.AttributeSet
import android.webkit.WebChromeClient
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.ProgressBar

class CustomWebView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : WebView(context, attrs, defStyleAttr) {

    private var progressBar: ProgressBar? = null

    init {
        // 初始化 WebView 设置
        initializeWebView()
    }

    /**
     * 初始化 WebView 配置
     */
    private fun initializeWebView() {
        settings.javaScriptEnabled = true // 启用 JavaScript
        settings.domStorageEnabled = true // 启用 DOM 存储
        settings.loadWithOverviewMode = true // 缩放至屏幕大小
        settings.useWideViewPort = true // 使用宽视口

        // 设置 WebViewClient
        webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
                // 在 WebView 内部加载链接
                view.loadUrl(url)
                return true
            }
        }

        // 设置 WebChromeClient 以监听加载进度
        webChromeClient = object : WebChromeClient() {
            override fun onProgressChanged(view: WebView, newProgress: Int) {
                super.onProgressChanged(view, newProgress)
                progressBar?.progress = newProgress
                if (newProgress == 100) {
                    progressBar?.visibility = android.view.View.GONE // 加载完成后隐藏进度条
                } else {
                    progressBar?.visibility = android.view.View.VISIBLE
                }
            }
        }
    }

    /**
     * 设置进度条
     */
    fun setProgressBar(progressBar: ProgressBar) {
        this.progressBar = progressBar
    }

    /**
     * 加载 HTML 内容
     */
    fun loadHtmlContent(htmlContent: String) {
        loadData(htmlContent, "text/html", "UTF-8")
    }

    /**
     * 加载远程 URL
     */
    fun loadUrlContent(url: String) {
        loadUrl(url)
    }

    /**
     * 处理返回键
     */
    fun handleBackPress(): Boolean {
        return if (canGoBack()) {
            goBack() // 返回上一个页面
            true
        } else {
            false
        }
    }
}

使用封装好的 WebView 工具类

  1. 在布局文件中使用 CustomWebView
    activity_main.xml 中使用 CustomWebView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.example.yourapp.CustomWebView
        android:id="@+id/customWebView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="match_parent"
        android:layout_height="4dp"
        android:visibility="visible"
        android:layout_alignParentTop="true" />
</RelativeLayout>
  1. Activity 中使用 CustomWebView
    MainActivity.kt 中使用封装好的 CustomWebView
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.yourapp.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 初始化 View Binding
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 设置进度条
        binding.customWebView.setProgressBar(binding.progressBar)

        // 加载 HTML 内容
        val htmlContent = """
            <html>
                <body>
                    <h1>Hello, Android!</h1>
                    <p>This is a sample HTML content loaded in WebView.</p>
                    <p><a href="https://www.google.com">Visit Google</a></p>
                </body>
            </html>
        """.trimIndent()
        binding.customWebView.loadHtmlContent(htmlContent)

        // 或者加载远程 URL
        // binding.customWebView.loadUrlContent("https://www.example.com")
    }

    override fun onBackPressed() {
        // 处理返回键
        if (!binding.customWebView.handleBackPress()) {
            super.onBackPressed()
        }
    }
}

工具类的功能说明
初始化配置:

启用 JavaScript。

启用 DOM 存储。

设置 WebViewClientWebChromeClient

加载内容:

支持加载 HTML 字符串(loadHtmlContent)。

支持加载远程 URLloadUrlContent)。

显示加载进度

通过 ProgressBar 显示加载进度。

处理返回键:

提供 handleBackPress 方法,用于在 Activity 中处理返回键逻辑。

可扩展性:

可以根据需要扩展工具类,例如添加缓存配置、处理混合内容等。

扩展功能(可选

  1. 启用缓存
    initializeWebView 方法中添加缓存配置:
settings.cacheMode = WebSettings.LOAD_DEFAULT
settings.domStorageEnabled = true
  1. 处理混合内容
    initializeWebView 方法中启用混合内容模式:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
}

3. 自定义 WebViewClient

如果需要更复杂的逻辑(例如拦截特定 URL),可以自定义 WebViewClient

webViewClient = object : WebViewClient() {
    override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
        if (url.contains("example.com")) {
            // 拦截特定 URL
            return true
        }
        view.loadUrl(url)
        return false
    }
}

总结
通过封装 WebView 工具类,可以将常见的配置和逻辑集中管理,减少重复代码,提高开发效率。工具类支持加载 HTML 内容、远程 URL、显示加载进度、处理返回键等功能,并且可以根据需要进一步扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值