我有WebView
我在其中显示我无法控制的网页内容。内容显示正常,但有产生弹出窗口的链接。执行此操作的javascript函数如下所示:
function getEntry(id) {
var win = window.open('', 'Booking',
'resizable=yes,scrollbars=yes,status=no,width=500,height=400');
win.document.location = '/some/url/1-' + id ;
}
我无法轻易改变这一点,如果负责我下载的页面的人会改变它,我想我的应用程序会失败......
活动中我的WebView
设置如下:
_webview = new WebView(this);
setContentView(_webview);
final Activity activity = this;
_chromeClient = new MyChromeClient();
_webview.setWebChromeClient(_chromeClient);
//I experimented with changing user agent, in case that would have any effect, it didn't...
_webview.getSettings().setUserAgentString("Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1");
_webview.setWebViewClient(new MyWebViewClient());
_webview.getSettings().setJavaScriptEnabled(true);
_webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
_webview.getSettings().setSupportZoom(true);
_webview.getSettings().setBuiltInZoomControls(true);
_webview.getSettings().setDomStorageEnabled(true);
//Cache settings...
_webview.getSettings().setAppCacheMaxSize(1024*1024*8);
_webview.getSettings().setAppCachePath("/data/data/com.your.package.appname/cache");
_webview.getSettings().setAllowFileAccess(true);
_webview.getSettings().setAppCacheEnabled(true);
MyWebClient:
private class MyWebViewClient extends WebViewClient {
@Override
public void onLoadResource(WebView view, String url) {
Log.d("MyWebViewClient",url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
showProgressDiag();
Log.d("MyWebViewClient","shouldOverride... : " + url);
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url){
hideProgressDiag();
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
if(failingUrl.equals("file:///android_asset/html/error.html")){
hideProgressDiag();
Toast.makeText(_context, "Error! Check internet connection, or try again later...", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(_context, failingUrl, Toast.LENGTH_SHORT).show();
view.loadUrl("file:///android_asset/html/error.html");
}
}
}
MyChromeClient:
private class MyChromeClient extends WebChromeClient{
@Override
public void onProgressChanged(WebView view, int progress) {
Pdiag.setProgress(progress * 100);
}
}
当点击其中一个指向javascript函数的链接时,所有发生的事情都是WebView
变为灰色,而不经过shouldOverrideUrlLoading()
。当我点击后退键时,应用程序退出,这意味着WebView
的导航历史记录中没有任何内容。有时没有任何事情发生,但是shouldOverrideUrlLoading()
确实运行,并且从Log.d()
我可以看到弹出窗口的正确URL已经提供给WebView。
事情是,在非常罕见的情况下,它显示很好,但我不知道如何重现它,并且它实际上显示在弹出窗口中。
我迷路了...而且很沮丧......想着看一部糟糕的情景喜剧:(
修改 实际上,也许URL毕竟不是那么正确......在Firefox中,URL以“X<<<<<”结尾但在我的Log.d()输出中,它以“X%3C%3C%3C%3C”结束......我将调查是否可以更改...
编辑2: 不,没有做任何事......这个网址与Firefox中的网址相同......
答案 0 :(得分:6)
首先,您需要在WebView
上设置以下设置:
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportMultipleWindows(true);
然后您需要附加覆盖WebChromeClient
的{{1}}。您对此方法的实现可以创建新的Web视图,并将其显示在对话框中:
onCreateWindow
不要忘记将新的网络视图设置为webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
WebView newWebView = new WebView(MyActivity.this);
WebSettings webSettings = newWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
// Other configuration comes here, such as setting the WebViewClient
final Dialog dialog = new Dialog(MyActivity.this);
dialog.setContentView(newWebView);
dialog.show();
newWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onCloseWindow(WebView window) {
dialog.dismiss();
}
});
((WebView.WebViewTransport)resultMsg.obj).setWebView(newWebView);
resultMsg.sendToTarget();
return true;
}
});
,将其发送到目标并返回true,如the API documentation中所述。
答案 1 :(得分:1)
请检查添加此内容 -
getSettings().setSupportMultipleWindows(true);