7

我可以很好地在 android webview 中显示 HTML 文件内容。现在我如何将参数传递到 HTML 文件中。例如,我的 HTML 内容有一个视频播放器,我需要将动态值(URL)传递到 HTML 文件中以播放动态视频。我的HTML 文件位于资产文件夹中。我该怎么做?

谢谢。

4

5 回答 5

11

我今天遇到了这个问题,但是我需要它来使用 UTF-8 编码,所以这是我的方法,希望它可以帮助某人并澄清这个问题的一些先前答案。

HTML:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
        <h1>%ERR_TITLE%</h1>
        <h2>%ERR_DESC%</h2>
    </body>
</html>

爪哇:

String content = IOUtils.toString(getAssets().open("error.html"))
    .replaceAll("%ERR_TITLE%", getString(R.string.error_title))
    .replaceAll("%ERR_DESC%", getString(R.string.error_desc))

mWebView.loadDataWithBaseURL("file:///android_asset/error.html", content, "text/html", "UTF-8", null);

至于 IOUtils: http ://commons.apache.org/proper/commons-io/download_io.cgi

于 2013-06-26T08:44:08.970 回答
4

而不是直接传递视频 URL(按照你的例子),我会在 Html 文件中使用令牌。例如:

<embed src="$VIDEO_URL$" autostart="false" />

$VIDEO_URL$在运行时将令牌替换为真实视频的位置URL

此外,由于您无法在运行时更改资产文件夹的内容,您应该将 html 文件内容加载到 String 变量中,并使用该replace方法将令牌替换为真实的URL,最后将该字符串传递给您的 webview。像这样的东西:

//The html variable has the html contents of the file stored in the assets folder
//and real_video_url string variable has the correct video url
html = html.replace("$VIDEO_URL$", real_video_url);
webview.loadData(html, "text/html", "utf-8");
于 2012-07-24T08:40:13.100 回答
3

如果我想在我的 HTML 中有一些动态的东西,我会有一个带有动态部分的 html,如下所示:

<B>%NAME%</B>

然后我会加载我的 HTML:

String template = Utils.inputStreamToString(assets.open("html/template.html"));

然后我会用我想要的东西替换所有动态部分:

String data = template.replaceAll("%NAME%", "Alice McGee");

然后我会将它传递给我的 webView!

WebView webView = new WebView(this);
webView.loadDataWithBaseURL("file:///android_asset/html/", data, "text/html", "utf-8", null);
于 2012-07-24T08:38:37.810 回答
2

我设法以不同的方式传递变量。

我的问题是每次我切换到另一个应用程序时,当进入 webapp 时,webview 会不断重新加载。我想这是因为我的方法中有以下一行onCreate()myWebView.loadUrl(url);我有在 url 中传递这些状态变量的想法,但你知道这还不可能。我所做的是使用 保存一些变量的状态onSaveInstanceState(Bundle outState) {...}并使用onRestoreInstanceState(Bundle savedInstanceState){...}.

在设置 myWebView 后的 onCreate 方法中,我执行了以下操作:

myWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String urlString)
{
     Log.i("onPageFinished", "loadVariables("+newURL+")");
     if(newURL!="")
         myWebView.loadUrl("javascript:loadVariables("+"\""+newURL+"\")");
}

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);
    return true;
}
});

jsInterface = new JSInterface(this,myWebView);
myWebView.addJavascriptInterface(jsInterface, "Android");

if (savedInstanceState != null)
{
// retrieve saved variables and build a new URL
newURL = "www.yoururl.com";
newURL +="?var1=" + savedInstanceState.getInt("key1");
newURL +="?var2=" + savedInstanceState.getInt("key2");
Log.i("myWebApp","NEW URL = " + newURL);
}
myWebView.loadUrl("www.yoururl.com");

因此,首先我使用默认 URL (www.yoururl.com) 加载页面,然后在 onPageFinished 上调用一个新的 javascript 方法,在其中传递变量。在 javascriptloadVariables函数中看起来像这样:

function loadVariables(urlString){
    // if it is not the default URL
    if(urlString!="www.yoururl.com")
    {
        console.log("loadVariables: " + urlString);
        // parse the URL using a javascript url parser (here I use purl.js)
        var source = $.url(urlString).attr('source');
        var query = $.url(urlString).attr('query');  
        console.log("URL SOURCE = "+source + " URL QUERY = "+query);
        //do something with the variables 
    }
}
于 2013-11-15T09:12:19.167 回答
1

这里的资产是什么意思?

字符串模板 = Utils.inputStreamToString(assets.open("html/template.html"));

于 2013-03-15T11:20:59.653 回答