该代码在模拟器上有效,但在实际设备上无效。
classJavaScriptInterface{
private TextView contentView;
public JavaScriptInterface(TextView aContentView){
contentView = aContentView;
}
@SuppressWarnings("unused")
public void processContent(String aContent){
final String content = aContent;
contentView.post(new Runnable(){
public void run(){
contentView.setText(content);
contentView.setTextColor(Color.DKGRAY);
}
});
}
}
TextView tv2 = (TextView) findViewById(R.id.source);
webview1.addJavascriptInterface(new JavaScriptInterface(tv2), "INTERFACE");
webview1.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url)
{
view.loadUrl("javascript:window.INTERFACE.processContent(document.getElementsByTagName('body')[0].innerText);");
}
});
最佳答案
以我的经验,onPageFinished()
并非总是一种可靠的方法来知道页面是否真正完成。根据您要加载的内容,在调用onPageFinished()
之后可能还会发生其他重定向或框架。有关更多详细信息,请参见此其他SO帖子:How to determine when Android WebView is completely done loading?
您可以通过在onPageFinished中添加延迟来快速检查这是否是问题所在:
@Override
public void onPageFinished(final WebView view, String url)
{
view.postDelayed(new Runnable()
{
public void run()
{
view.loadUrl("javascript:window.INTERFACE.processContent(document.getElementsByTagName('body')[0].innerText);");
}
}, 5000);
}
如果延迟有效,则应使用另一篇文章中描述的方法解决此问题(不要在最终产品中使用5s延迟的postDelayed)。