kotlin项目添加一个指定url的webview

以下是在 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

运行结果

完成以上步骤后,运行应用,你将看到:

  1. 应用启动后直接加载你指定的 URL
  2. 网页在 WebView 内显示,不会跳转到外部浏览器
  3. 按返回键可以在网页内返回上一页
  4. 显示加载进度(如果使用了进度条版本)

这样就完成了在 Kotlin 空项目中添加指定 URL WebView 的全部步骤。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值