Android WebView点击链接跳转外部浏览器 如何实现应用内加载
问题原因
Android原生WebView默认不带内部链接拦截处理,点击页面链接时会把跳转请求抛给系统,直接唤起默认浏览器加载,自然会跳出当前应用。
修复方法
给WebView设置自定义WebViewClient,重写shouldOverrideUrlLoading方法拦截所有跳转,强制URL在当前WebView内加载即可。
- 首先在文件头部导入缺失的
WebViewClient类 - 给WebView实例添加
setWebViewClient配置,拦截跳转请求 - 可选补充返回键逻辑,支持按返回键回退WebView历史页面,而不是直接退出应用
修改后完整可运行代码
package com.example.appthree; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String Htmlurl = "https://www.egkhindi.com/"; webView = findViewById(R.id.webView); // 基础JS支持 webView.getSettings().setJavaScriptEnabled(true); // 开启DOM存储适配,多数现代网站依赖该配置,否则可能出现白屏、功能异常 webView.getSettings().setDomStorageEnabled(true); // 核心拦截配置:所有链接强制在当前WebView加载 webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); webView.loadUrl(Htmlurl); } // 物理返回键适配:支持回退上一个网页,而非直接退出应用 @Override public void onBackPressed() { if (webView.canGoBack()) { webView.goBack(); } else { super.onBackPressed(); } } }
补充说明
如果需要做域名白名单限制,仅允许站内链接在应用内加载,外部链接仍然跳转系统浏览器,可以在shouldOverrideUrlLoading方法中判断URL的host字段,匹配目标站点域名时执行内部加载返回true,非目标域名直接返回false交给系统处理即可。如果页面需要弹窗、上传文件等交互,额外配置WebChromeClient实现对应能力即可,不影响基础跳转逻辑。
内容的提问来源于stack exchange,提问作者Satish Thakur
相关产品推荐
相关产品推荐

