在 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 工具类
- 在布局文件中使用 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>
- 在 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 存储。
设置 WebViewClient 和 WebChromeClient。
加载内容:
支持加载 HTML 字符串(loadHtmlContent)。
支持加载远程 URL(loadUrlContent)。
显示加载进度:
通过 ProgressBar 显示加载进度。
处理返回键:
提供 handleBackPress 方法,用于在 Activity 中处理返回键逻辑。
可扩展性:
可以根据需要扩展工具类,例如添加缓存配置、处理混合内容等。
扩展功能(可选)
- 启用缓存
在 initializeWebView 方法中添加缓存配置:
settings.cacheMode = WebSettings.LOAD_DEFAULT
settings.domStorageEnabled = true
- 处理混合内容
在 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、显示加载进度、处理返回键等功能,并且可以根据需要进一步扩展。