use*_*714 5 android webview android-webview
我有一个WebView,它从服务器加载html页面,但是该页面在WebView上不可见。html已正确加载(我已使用chrome:// inspect调试,并且html,包括所有存在的javascript都存在),但在电话屏幕上不可见。出现此错误时,我的代码没有任何更改。当我在手机上安装Android System WebView更新时,出现了该错误。如果我卸载更新,则所有更新都将再次正常运行。此外,我检查了WebViewClient的回调,并注意到未调用onPageCommitVisible。因此,该页面无法正确加载。仅当我按下“后退”按钮以退出WebView时,我才会看到为我的网页调用了onPageCommitVisible(但这样做没有帮助,因为后退按钮确实存在WebView)。
这是我的webview代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout rlMain = new RelativeLayout(getActivity());
rlMain.setContentDescription(Constants.STARTAPP_AD_MAIN_LAYOUT_CONTENT_DESCRIPTION);
rlMain.setId(Constants.MAIN_LAYOUT_ID);
getActivity().setContentView(rlMain);
// Create WebView and set its parameters
try{
webView = new WebView(getActivity().getApplicationContext());
webView.setBackgroundColor(0xFF000000);
getActivity().getWindow().getDecorView().findViewById(android.R.id.content).setBackgroundColor(0x00777777);
webView.setVerticalScrollBarEnabled(false);
webView.setHorizontalScrollBarEnabled(false);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
// set software acceleration
if (softwareAcceleration) {
ApiUtil.setWebViewLayerTypeSoftware(webView, null);
}
webView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return true;
}
});
webView.setLongClickable(false);
webView.addJavascriptInterface(createJsInterface(), Constants.INTERFACE);
setWebViewSpecificParameters(webView);
webView.loadDataWithBaseURL("http://www.xxxxxx.com", getHtml(), "text/html", "utf-8", null);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
webView.setWebViewClient(new MyWebViewClient());
RelativeLayout.LayoutParams webviewPrms = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT
);
rlMain.addView(webView, webviewPrms);
}
public void setWebViewSpecificParameters(final WebView webView) {
webView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return (event.getAction() == MotionEvent.ACTION_MOVE);
}
});
}
private class MyWebViewClient extends WebViewClient {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
Logger.log(TAG, Log.DEBUG, "!!!!!shouldInterceptRequest" );
return super.shouldInterceptRequest(view, url);
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
Logger.log(TAG, Log.DEBUG, "!!!!!shouldInterceptRequest" );
return super.shouldInterceptRequest(view, request);
}
@Override
public void onPageFinished(WebView view, String url) {
setWebViewBackground(view);
runJavascript(Constants.JAVASCRIPT_SET_MODE_SERVER, getPosition());
runJavascript(Constants.JAVASCRIPT_ENABLE_SCHEME, "externalLinks");
InterstitialMode.this.onWebviewPageFinished();
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return clicked(url);
}
}
Run Code Online (Sandbox Code Playgroud)
在根据用户输入从一个网站导航到另一个网站的应用程序中,调用后第二个网站很可能根本不会显示(>50%),WebView.loadUrl而前一个网站仍然可见 - 它甚至是交互式的,即滚动有效。再次致电后,问题通常会得到解决WebView.loadUrl。除了用户看不到第二个网站之外,没有明显迹象表明发生了错误。依靠用户手动重新加载页面并不是一个令人满意的解决方案,因为错误经常发生。
我能够通过使用自定义WebViewClient来检测第二个网站未正确加载并触发重新加载来解决此问题:
setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
buggyWebViewHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (!wasCommitCalled) {
loadUrl(url);
}
}
}, 2500);
}
}
@Override
public void onPageCommitVisible(WebView view, String url) {
wasCommitCalled = true;
}
});
Run Code Online (Sandbox Code Playgroud)
buggyWebViewHandler处理程序或任何其他允许将一段代码推迟一段时间的类在哪里。此外,您需要在调用wasCommitCalled = false;时进行设置WebView.loadUrl- 例如通过覆盖该方法。
请注意,这仅适用于 Android 23 及以上版本,因为那是onPageCommitVisible添加的时间。请参阅此处的完整实现:https://github.com/TomTasche/OpenDocument.droid/blob/8c2eec5c57e5962e9ac4c46549be2241b259eb32/app/src/main/java/at/tomtasche/reader/ui/widget/PageView.java#L72-L96
如果有人有足够的勇气深入研究为什么会发生这种情况:在调试时,似乎只要发生此错误,就不会调用 onPageStarted 。也许这有帮助...
| 归档时间: |
|
| 查看次数: |
1794 次 |
| 最近记录: |