如何在webview中正确加载资产html文件中的字符串

时间:2018-01-01 20:33:59

标签: android html webview assets

我在资产文件夹中有一个html文件,我想在webview中加载它。我想使用字符串,而不是文件,以便在我想要时替换文件的内容(只保留一个文件并更改我想要显示的内容)。 例如我的html文件是这样的:

<!DOCTYPE html>
<html>
<head>
    <title>This is demo</title>
</head>
<body>

<p data-height="265" data-theme-id="0" data-slug-hash="dYPxYp" data-default-tab="html,result" data-user="sckarolos" data-embed-version="2" data-pen-title="SVG Shape Example" class="codepen">
    See the Pen <a href="https://codepen.io/sckarolos/pen/dYPxYp/">SVG Shape Example</a>
    by sckarolos (<a href="https://codepen.io/sckarolos">@sckarolos</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>


</body>
</html>

我有两种方法可以将资产中的html文件作为字符串读取并将其加载到webview中:

private String getHtmlFromAsset() {
        InputStream is;
        StringBuilder builder = new StringBuilder();
        String htmlString = null;
        try {
            is = getAssets().open(htmlFilename);
            if (is != null) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
                }

                htmlString = builder.toString();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return htmlString;
    }

    /**
     * Loads html page with the content.
     */
    private void loadHtmlPage(WebView webView) {
        String htmlString = getHtmlFromAsset();
        if (htmlString != null) {
            webView.loadDataWithBaseURL(null, htmlString, "text/html", "UTF-8", null);
        }
        else
            Toast.makeText(this, "No such page", Toast.LENGTH_LONG).show();
    }     

在我的活动中,我使用这样的webview:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        AssetManager assetManager = getAssets();

         //try to display html content
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setAllowContentAccess(true);
        webView.getSettings().setAllowFileAccess(true);
        webView.getSettings().setAllowFileAccessFromFileURLs(true);
        webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        loadHtmlPage(webView);
      }     

在debuging上我可以看到我的文件读取成功,我的字符串有html文件的内容。但是当我尝试在webview中加载它时,结果一无所获。如果我尝试使用以下方法加载本地html文件:

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

然后文件加载并成功显示。 我想我的错是使用我从getHtmlFromAsset取回并传入loadHtmlPage的字符串的方式。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

这里,代码泛需要javascript访问权限,所以当链接加载时你需要提供javascript访问权限。这是工作代码也检查我的模拟器。另外,不要忘记在清单上提供互联网许可。

<强> XML:

<WebView
    android:id="@+id/wv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

<强> JAVA:

String str = "<!DOCTYPE html>\n" +
        "<html>\n" +
        "<head>\n" +
        "    <title>This is demo</title>\n" +
        "</head>\n" +
        "<body>\n" +
        "\n" +
        "<p data-height=\"265\" data-theme-id=\"0\" data-slug-hash=\"dYPxYp\" data-default-tab=\"html,result\" data-user=\"sckarolos\" data-embed-version=\"2\" data-pen-title=\"SVG Shape Example\" class=\"codepen\">\n" +
        "    See the Pen <a href=\"https://codepen.io/sckarolos/pen/dYPxYp/\">SVG Shape Example</a>\n" +
        "    by sckarolos (<a href=\"https://codepen.io/sckarolos\">@sckarolos</a>) on <a href=\"https://codepen.io\">CodePen</a>.</p>\n" +
        "<script async src=\"https://production-assets.codepen.io/assets/embed/ei.js\"></script>\n" +
        "\n" +
        "\n" +
        "</body>\n" +
        "</html>";
WebView wv = findViewById(R.id.wv);
wv.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        // do your handling codes here, which url is the requested url
        view.getSettings().setJavaScriptEnabled(true);
        view.loadUrl(url);
        return false; // then it is not handled by default action
    }
});
wv.loadData(str, "text/html", "UTF-8");