我有一个本地html页面以及其他几个资源指向它(css文件和Javascript库),我想加载到一个WebView。这是如何实现的呢?

也许不是最好的方法,但我仍在尝试。


当前回答

来自官方指南https://developer.android.com/develop/ui/views/layout/webapps/load-local-content:

将HTML作为资产存储在app/src/main/assets/中 使用WebViewAssetLoader加载资产。在你的onCreate()中构造它,如下所示:

final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
         .addPathHandler("/assets/", new WebViewAssetLoader.AssetsPathHandler(this))
         .addPathHandler("/res/", new WebViewAssetLoader.ResourcesPathHandler(this))
         .build();

子类WebViewClient包装WebViewAssetLoader:

private static class LocalContentWebViewClient extends WebViewClientCompat {

    private final WebViewAssetLoader mAssetLoader;

    LocalContentWebViewClient(WebViewAssetLoader assetLoader) {
        mAssetLoader = assetLoader;
    }

    @Override
    @RequiresApi(21)
    public WebResourceResponse shouldInterceptRequest(WebView view,
                                     WebResourceRequest request) {
        return mAssetLoader.shouldInterceptRequest(request.getUrl());
    }

    @Override
    @SuppressWarnings("deprecation") // to support API < 21
    public WebResourceResponse shouldInterceptRequest(WebView view,
                                     String url) {
        return mAssetLoader.shouldInterceptRequest(Uri.parse(url));
    }
}

这基本上是将请求URL传递给WebViewAssetLoader以从资产加载web内容。

使用assetLoader从(2)构造WebViewClient从(3),并设置它在你的WebView。你的index.html可以通过使用https和默认域appassets.androidplatform.net加载:

mWebView.setWebViewClient(new LocalContentWebViewClient(assetLoader));
mWebView.loadUrl("https://appassets.androidplatform.net/assets/index.html");

注意,使用类似web的url而不是file://加载本地文件是可取的,因为它与同源策略兼容。

其他回答

来自官方指南https://developer.android.com/develop/ui/views/layout/webapps/load-local-content:

将HTML作为资产存储在app/src/main/assets/中 使用WebViewAssetLoader加载资产。在你的onCreate()中构造它,如下所示:

final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
         .addPathHandler("/assets/", new WebViewAssetLoader.AssetsPathHandler(this))
         .addPathHandler("/res/", new WebViewAssetLoader.ResourcesPathHandler(this))
         .build();

子类WebViewClient包装WebViewAssetLoader:

private static class LocalContentWebViewClient extends WebViewClientCompat {

    private final WebViewAssetLoader mAssetLoader;

    LocalContentWebViewClient(WebViewAssetLoader assetLoader) {
        mAssetLoader = assetLoader;
    }

    @Override
    @RequiresApi(21)
    public WebResourceResponse shouldInterceptRequest(WebView view,
                                     WebResourceRequest request) {
        return mAssetLoader.shouldInterceptRequest(request.getUrl());
    }

    @Override
    @SuppressWarnings("deprecation") // to support API < 21
    public WebResourceResponse shouldInterceptRequest(WebView view,
                                     String url) {
        return mAssetLoader.shouldInterceptRequest(Uri.parse(url));
    }
}

这基本上是将请求URL传递给WebViewAssetLoader以从资产加载web内容。

使用assetLoader从(2)构造WebViewClient从(3),并设置它在你的WebView。你的index.html可以通过使用https和默认域appassets.androidplatform.net加载:

mWebView.setWebViewClient(new LocalContentWebViewClient(assetLoader));
mWebView.loadUrl("https://appassets.androidplatform.net/assets/index.html");

注意,使用类似web的url而不是file://加载本地文件是可取的,因为它与同源策略兼容。

最简单的方法可能是把你的web资源放入assets文件夹,然后调用:

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

关于Java和Webview之间的完全通信,请参阅此

更新:资产文件夹通常是以下文件夹: <项目> / src / main /资产 这可以在<app>中的资产文件夹配置设置中更改。Iml文件为:

<option name= " ASSETS_FOLDER_RELATIVE_PATH " value= " /src/main/assets " /> . 在Android Studio中放置资产文件夹的位置

XML布局文件:

<WebView android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/webView"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".activities.Bani9">
</WebView>

Java代码:

public class Bani9 extends AppCompatActivity {
    WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bani9);
        webView = findViewById(R.id.webView);
        WebSettings webSetting = webView.getSettings();
        webSetting.setBuiltInZoomControls(true);
        webView.setWebViewClient(new WebViewClient());

        webView.loadUrl("file:///android_asset/punjabi/bani9.html");
    }
}

确保您正确地设置了文件路径。

“公认答案”对我没用,对我有用的是这个

WebSettings webSetting = webView.getSettings();
    webSetting.setBuiltInZoomControls(true);
    webView1.setWebViewClient(new WebViewClient());

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

在这种情况下,使用webview# loadDataWithBaseUrl()比webview# loadUrl()更好!

webView.loadDataWithBaseURL(url, 
        data,
        "text/html",
        "utf-8",
        null);

url/path指向所有JavaScript文件和html链接的源目录的字符串。如果为null,则约为:空白。 data:包含你的hmtl文件的字符串,例如用BufferedReader读取

更多信息:WebView.loadDataWithBaseURL(java.lang。字符串,. lang。字符串,. lang。字符串,. lang。字符串,以)