【问题标题】:How to load correctly a string from asset html file in a webview如何从 webview 中的资产 html 文件中正确加载字符串
【发布时间】:2018-01-01 20:33:59
【问题描述】:

我在资产文件夹中有一个 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);
      }     

在调试时,我可以看到我的文件已成功读取,并且我的字符串具有 html 文件的内容。但是当我尝试在 webview 中加载它时,结果什么都没有。如果我尝试使用此加载本地 html 文件:

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 试试这个webView.loadDataWithBaseURL("", htmlString, "text/html", "UTF-8", ""); 我想如果你使用null 那么它会求助于'about:blank'。
  • 感谢您的评论。如您所说,我尝试在 loadDataWithBaseURL 方法中使用“”而不是 null 但它不起作用,结果仍然相同,一个空的 webview。

标签: android html webview assets


【解决方案1】:

这里,code pan 需要 javascript 访问,所以当链接加载时,您需要提供 javascript 访问。这是工作代码也检查到我的模拟器。另外,不要忘记在清单上授予 Internet 权限。

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");

【讨论】:

  • 我试过了,但它不起作用。结果又是一个空的 webview。您是否尝试过代码并设法让内容显示在 webview 中?
  • @Zapas 在这里,这段代码也可以尝试并且运行良好。你可以试试这个吗?
  • 您好,我刚刚测试了您的代码,但仍然无法正常工作。它一直给我空的网页视图。我试图理解我做错了什么。我可以加载 html 文件的唯一方法是使用 webView.loadUrl("file:///android_asset/myFile.html")。由于字符串总是空的 webview。
  • 我将 getHtmlFromAsset 方法返回的字符串复制到记事本中,并将其保存为 html 文件。我在浏览器中运行 html 文件并正确显示。所以我认为我的错在于我尝试在 webview 中传递字符串的方式。
  • 我在模拟器 (genymotion) 和真实设备 (Huawei P9 Lite) 中测试了代码,但结果我只得到了 javascript 之前的代码(参见 sckarolos 的 Pen Switch Button #2 (@sckarolos) on CodePen) 上面没有 javascript 功能。在您的测试中,您是否设法在 web 视图中看到此结果link?我相信我错过了在将其作为字符串读取后必须在我的 html 文件中使用 javascript 的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 2011-03-10
  • 2020-05-16
  • 1970-01-01
  • 2012-09-05
  • 2019-08-13
相关资源
最近更新 更多