以下是在 Kotlin 空项目中添加一个指定 URL 的 WebView 的完整步骤:
1. 创建新项目
首先创建一个新的 Android 项目:
- 选择 Empty Activity 模板
- 语言选择 Kotlin
- 最低 API Level 建议 21 (Android 5.0) 或更高
2. 添加网络权限
在 AndroidManifest.xml 中添加网络权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 添加网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 如果需要访问非 HTTPS 网站,添加此权限(不推荐生产环境使用) -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.MyApplication"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
3. 修改布局文件
修改 res/layout/activity_main.xml,添加 WebView:
<?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:orientation="vertical">
<!-- 可选:添加进度条 -->
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="4dp"
android:visibility="gone" />
<!-- WebView -->
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
4. 实现 MainActivity
修改 MainActivity.kt:
package com.example.myapplication
import android.annotation.SuppressLint
import android.graphics.Bitmap
import android.os.Bundle
import android.view.View
import android.webkit.WebChromeClient
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var webView: WebView
private lateinit var progressBar: ProgressBar
// 在这里指定你要加载的 URL
private val targetUrl = "https://www.example.com" // 替换为你的目标 URL
@SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 初始化视图
progressBar = findViewById(R.id.progressBar)
webView = findViewById(R.id.webView)
// 配置 WebView
setupWebView()
// 加载指定 URL
webView.loadUrl(targetUrl)
}
@SuppressLint("SetJavaScriptEnabled")
private fun setupWebView() {
val webSettings = webView.settings
// 启用 JavaScript
webSettings.javaScriptEnabled = true
// 启用 DOM 存储
webSettings.domStorageEnabled = true
// 启用缩放控制(可选)
webSettings.setSupportZoom(true)
webSettings.builtInZoomControls = true
webSettings.displayZoomControls = false
// 设置缓存策略
webSettings.cacheMode = android.webkit.WebSettings.LOAD_DEFAULT
// 设置 WebViewClient 以确保链接在 WebView 内打开
webView.webViewClient = object : WebViewClient() {
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
// 显示加载进度
progressBar.visibility = View.VISIBLE
super.onPageStarted(view, url, favicon)
}
override fun onPageFinished(view: WebView?, url: String?) {
// 隐藏加载进度
progressBar.visibility = View.GONE
super.onPageFinished(view, url)
}
// 处理链接重定向,确保在 WebView 内打开
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
view.loadUrl(url)
return true
}
// 对于 API 24+ 使用这个版本
override fun shouldOverrideUrlLoading(
view: WebView,
request: android.webkit.WebResourceRequest
): Boolean {
view.loadUrl(request.url.toString())
return true
}
}
// 设置 WebChromeClient 来显示加载进度
webView.webChromeClient = object : WebChromeClient() {
override fun onProgressChanged(view: WebView?, newProgress: Int) {
super.onProgressChanged(view, newProgress)
progressBar.progress = newProgress
// 当加载完成时隐藏进度条
if (newProgress == 100) {
progressBar.visibility = View.GONE
} else {
progressBar.visibility = View.VISIBLE
}
}
}
}
// 处理返回键,允许在 WebView 内返回上一页
override fun onBackPressed() {
if (webView.canGoBack()) {
webView.goBack()
} else {
super.onBackPressed()
}
}
// 在 Activity 生命周期中正确管理 WebView
override fun onResume() {
super.onResume()
webView.onResume()
}
override fun onPause() {
super.onPause()
webView.onPause()
}
override fun onDestroy() {
super.onDestroy()
webView.destroy()
}
}
5. 简化版本(如果不需要进度条)
如果你不需要进度条,可以使用这个简化版本:
布局文件 (activity_main.xml):
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
MainActivity.kt:
package com.example.myapplication
import android.annotation.SuppressLint
import android.os.Bundle
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var webView: WebView
private val targetUrl = "https://www.example.com" // 替换为你的目标 URL
@SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
webView = findViewById(R.id.webView)
// 基础配置
webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true
// 确保链接在 WebView 内打开
webView.webViewClient = WebViewClient()
// 加载 URL
webView.loadUrl(targetUrl)
}
// 处理返回键
override fun onBackPressed() {
if (webView.canGoBack()) {
webView.goBack()
} else {
super.onBackPressed()
}
}
}
6. 配置网络安全(针对 Android 9+)
对于 Android 9 (API 28) 及以上,如果加载 HTTP 网站,需要在 res/xml/network_security_config.xml 创建网络安全配置:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">your-domain.com</domain>
</domain-config>
</network-security-config>
然后在 AndroidManifest.xml 的 application 标签中添加:
android:networkSecurityConfig="@xml/network_security_config"
7. 测试不同的 URL
你可以修改 targetUrl 变量来测试不同的网站:
// 测试不同的 URL
private val targetUrl = "https://www.google.com"
// private val targetUrl = "https://github.com"
// private val targetUrl = "https://stackoverflow.com"
// private val targetUrl = "file:///android_asset/local.html" // 加载本地 HTML
运行结果
完成以上步骤后,运行应用,你将看到:
- 应用启动后直接加载你指定的 URL
- 网页在 WebView 内显示,不会跳转到外部浏览器
- 按返回键可以在网页内返回上一页
- 显示加载进度(如果使用了进度条版本)
这样就完成了在 Kotlin 空项目中添加指定 URL WebView 的全部步骤。

1701

被折叠的 条评论
为什么被折叠?



