Android WebView配置:自有网站内嵌打开,外部链接跳转浏览器
实现WebView仅打开自有站点,外部链接跳转系统浏览器的解决方案
嘿,我看了你这段Android WebView的代码,需求是只让little.com在WebView里打开,外部链接跳系统浏览器对吧?咱们来调整下你的代码,让它完美实现这个需求~
问题分析
你的核心思路是对的,但有几个小细节需要优化:
- 缺少
Uri类的导入,代码会直接编译报错 - 使用
url.contains("little.com")的判断不够严谨,可能会误判其他包含该字符串的外部链接(比如xxxlittle.com) - 没有覆盖Android N及以上推荐的
shouldOverrideUrlLoading(WebView, WebResourceRequest)重载方法,兼容性不足
修正后的完整代码
AndroidManifest.xml(现有配置没问题,无需修改)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.little.example"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- The below is for the splash screen and we need no action bar and the default theme --> <activity android:name=".homeActivity" android:theme="@style/AppTheme.NoActionBar" android:noHistory="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:configChanges="keyboardHidden|orientation|screenSize" android:name=".MainActivity"> </activity> </application> </manifest>
MainActivity.kt(修正版)
package com.little.example import android.content.Intent import android.net.Uri import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) webview.settings.javaScriptEnabled = true // 开启DOM存储API,避免部分网页功能异常(可选,根据你的站点需求调整) webview.settings.domStorageEnabled = true webview.loadUrl("https://little.com") webview.webViewClient = MyWebViewClient() } override fun onBackPressed() { if (webview.canGoBack()) { webview.goBack() } else { super.onBackPressed() } } private inner class MyWebViewClient : WebViewClient() { // 兼容Android N及以上版本 override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { val url = request.url.toString() return handleUrlLoading(view, url) } // 兼容Android N以下版本 override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { return handleUrlLoading(view, url) } // 统一处理URL跳转逻辑,避免重复代码 private fun handleUrlLoading(view: WebView, url: String): Boolean { val uri = Uri.parse(url) val host = uri.host ?: return false // 判断是否为自有站点:精确匹配主域名,若支持子域名可改用host.endsWith(".little.com") return if (host == "little.com" || host.endsWith(".little.com")) { // 自有站点,在WebView内打开 view.loadUrl(url) false } else { // 外部链接,跳转系统默认浏览器 val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) startActivity(intent) true } } } }
关键优化点说明
- 添加Uri导入:解决编译报错问题
- 全版本兼容:同时覆盖新旧两个版本的
shouldOverrideUrlLoading方法,适配所有Android版本 - 严谨的域名判断:通过
Uri.host提取域名,精确匹配主域名或子域名,彻底避免误判 - 可选增强:开启
domStorageEnabled,解决部分依赖DOM存储的网页功能异常问题
内容的提问来源于stack exchange,提问作者Nisha Atram
相关产品推荐
相关产品推荐

