Android Studio Kotlin 开发安卓 WebView 应用
简介
使用 Android Studio 配合 Kotlin 开发一个内嵌 WebView 的安卓应用,在 WebView 中加载本地资源,在 APP 中捕获按键事件对 WebView 中的内容进行操作。
依赖
- Android Studio
- 基础的编程知识
步骤
AS 创建项目
在 AS 打开新窗口后,等待右下角进度条初始化完毕。创建一个 Empty Activity。
AS 创建虚拟机
启动模板项目,找到镜像下载并创建虚拟机。
修改项目
新增按键捕获功能
实现安卓应用捕获键盘上下方向键并打印日志信息的功能。在模拟器中的应用区域按下上下键,查看日志输出。
新增 WebView
将 Greeting 中的 Text 控件替换为 WebView。配置网络权限,确保页面可正常加载。
若遇到网页无法访问的问题,检查网络权限配置(AndroidManifest.xml)及虚拟机网络连接状态。修复 Modifier 'override' is not applicable to 'local function' 报错,移除局部函数上的 override 修饰符。
注意:WebView 优先处理事件可能导致应用程序无法捕获上下键,需调整事件分发逻辑。
WebView 加载本地资源
- 打印 WebView 请求的链接。
- 确定本地资源文件存放目录(assets),生成示例文件。
- 在
shouldInterceptRequest中拦截请求,加载本地资源文件。 - 手动修复代码路径斜杠问题,确保日志正确打印。
在按键回调中向 WebView 注入 JS 代码
- 在
onKeyDown回调中修改 WebView 显示内容。 - 解决
webViewInstance为 null 的问题。由于 AndroidView 异步执行导致返回时 WebView 未初始化,改用回调方式传递 WebView 实例。 - 使用
evaluateJavascript注入 JS 代码,避免直接跳转 URL。 - 调试时可通过 Edge 浏览器 inspect 设备连接进行验证。
最终关键代码
MainActivity.kt
package com.example.dm2
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
androidx.compose.ui.tooling.preview.Preview
com.example.dm2.ui.theme.DM2Theme
android.util.Log
android.view.KeyEvent
android.webkit.WebView
android.webkit.WebViewClient
android.webkit.WebResourceRequest
android.webkit.WebResourceResponse
androidx.compose.ui.platform.LocalContext
androidx.compose.ui.viewinterop.AndroidView
java.io.IOException
webViewInstance: WebView? =
: () {
{
.onCreate(savedInstanceState)
setContent {
DM2Theme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
Greeting() { webView ->
webViewInstance = webView
}
}
}
}
}
: {
(keyCode) {
KeyEvent.KEYCODE_DPAD_UP -> {
Log.d(, + webViewInstance)
webViewInstance?.evaluateJavascript(, )
}
}
.onKeyDown(keyCode, event)
}
{
context = LocalContext.current
AndroidView(
factory = { ctx ->
webView = WebView(ctx).apply {
settings.javaScriptEnabled =
Log.d(, )
webViewClient = : WebViewClient() {
: WebResourceResponse? {
url = request.url.toString()
(url.equals()) {
{
inputStream = context.assets.()
WebResourceResponse(, , inputStream)
} (e: IOException) {
e.printStackTrace()
}
}
Log.d(, )
.shouldInterceptRequest(view, request)
}
}
loadUrl()
isFocusable =
isFocusableInTouchMode =
: {
}
}
onWebViewCreated(webView)
webView
},
modifier = modifier
)
}
{
DM2Theme {
Greeting()
}
}
}


