在传递某个HTML有效负载时,我遇到了WebView的loadData
方法的问题。有效负载包含一些JavaScript,它将window.location
设置为具有自定义方案的URL(以下示例中为mycustomscheme://
)。这样做的原因是我希望我的应用程序代码能够在shouldOverrideUrlLoading
的实现中捕获各种JS事件。
在我的Galaxy Nexus设备(运行Ice Cream Sandwich)上,shouldOverrideUrlLoading
按预期工作,但WebView并不会出现在屏幕上。如果我从JS中删除window.location
代码,WebView就会显示出来。该代码似乎也适用于我尝试过的所有ICS前设备。
我在下面的代码中遗漏了一些明显的东西吗?
编辑:我可以使用addJavascriptInterface
来完成同样的事情,但我不想这样做,因为并非所有的HTML都是由我生成的。为了保持代码示例的清晰度,我省略了这个细节。
public class ICSWebViewTestActivity extends Activity {
private RelativeLayout mLayout;
private WebView mWebView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLayout = new RelativeLayout(this);
mLayout.setBackgroundColor(Color.RED);
setContentView(mLayout);
mWebView = new WebView(this);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setBackgroundColor(Color.GREEN);
mWebView.setWebViewClient(new MyWebViewClient());
String data =
"<html><head>" +
"<script>" +
"window.onload = f;" + // works if this line is removed
"function f() { window.location = 'mycustomscheme://finish'; }" +
"</script>" +
"</head>" +
"<body><h1 style='color:blue'>Hello, world!</h1></body>";
mWebView.loadData(data, "text/html", "utf-8");
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
rlp.addRule(RelativeLayout.CENTER_IN_PARENT);
mLayout.addView(mWebView, rlp);
}
private void doAction() {
Toast.makeText(this, "Doing action!", Toast.LENGTH_SHORT).show();
}
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("mycustomscheme://")) {
doAction();
}
return true;
}
}
}
答案 0 :(得分:0)
为什么不调用addJavascriptInterface到WebView,然后从javascript调用interfaceName,而不是设置window.location
?