You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android WebView中关联HTML文件方法及点击链接崩溃问题求助

解决Android WebView加载本地HTML链接崩溃的问题

别担心,这个问题其实很常见,核心原因是WebView默认会把链接跳转请求交给系统浏览器处理,但本地HTML文件是存放在你的app内部的,外部浏览器根本访问不到,所以就会崩溃。咱们一步步来解决:

第一步:让WebView自己处理链接跳转

你需要给WebView设置一个WebViewClient,拦截所有链接请求,让WebView自己加载,而不是跳外部浏览器。这样本地文件就能正常打开了。

在你的Activity代码里添加这段配置:

webView.setWebViewClient(new WebViewClient() {
    // 适配低版本Android
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url); // 让当前WebView加载链接
        return true;
    }

    // 适配Android 7及以上版本
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, android.webkit.WebResourceRequest request) {
        view.loadUrl(request.getUrl().toString());
        return true;
    }
});

第二步:确保本地HTML文件的路径正确

最稳妥的做法是把所有HTML文件(包括主页面和其他htm文件)都放到app的assets文件夹里:

  1. 如果你的项目里没有assets文件夹,就在app/src/main目录下新建一个(右键main → New → Folder → Assets Folder,直接点Finish就行)。
  2. 把你的主HTML文件(比如index.html)和所有子htm文件都复制到这个assets文件夹里。

然后加载主页面的时候用这个路径:

webView.loadUrl("file:///android_asset/index.html");

另外,主页面里的链接一定要用相对路径,比如:

<a href="page1.htm">打开页面1</a>
<a href="subfolder/page2.htm">打开子文件夹里的页面2</a>

绝对路径会导致WebView找不到文件,千万不要写file:///xxx这种绝对路径哦。

第三步:配置WebView的必要参数

还要给WebView开一些必要的权限和设置,确保能正常访问本地文件:

WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true); // 如果你的HTML页面用到了JS,就打开这个
webSettings.setAllowFileAccess(true); // 允许访问文件
webSettings.setAllowFileAccessFromFileURLs(true); // 允许从文件URL加载其他文件
webSettings.setAllowUniversalAccessFromFileURLs(true); // 高版本可能需要这个

完整的Activity代码示例

把这些整合起来,你的MainActivity代码大概是这样的:

import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = findViewById(R.id.webview);

        // 配置WebView基础设置
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAllowFileAccess(true);
        webSettings.setAllowFileAccessFromFileURLs(true);
        webSettings.setAllowUniversalAccessFromFileURLs(true);

        // 设置WebViewClient拦截链接跳转
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, android.webkit.WebResourceRequest request) {
                view.loadUrl(request.getUrl().toString());
                return true;
            }
        });

        // 加载assets里的主HTML文件
        webView.loadUrl("file:///android_asset/index.html");
    }

    // 给WebView加返回键功能,点击返回键能回到上一个页面
    @Override
    public void onBackPressed() {
        if (webView.canGoBack()) {
            webView.goBack();
        } else {
            super.onBackPressed();
        }
    }
}

最后检查一下

  1. 确认所有HTML文件都在assets文件夹里,没有放错位置。
  2. 主页面的链接都是相对路径,没有拼写错误。
  3. 布局文件里的WebView控件id是webview(和代码里的findViewById(R.id.webview)对应),如果你的id不一样,记得改成对应的名字。

这样修改之后,点击链接应该就不会崩溃了,能正常在WebView里打开本地的htm文件啦!

内容的提问来源于stack exchange,提问作者user9719113

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:39:42