该代码在模拟器上有效,但在实际设备上无效。

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)。

07-24 09:47