如何使用Http Post从WebView检索和修改HTML内容

时间:2015-08-25 17:51:43

标签: java android html webview

我正在开发一个显示HTML页面某些部分的Android应用程序。第一步,我使用问题How to retrieve HTML content from WebView中提供的代码。

  • 完整的html图片

part 1

  • 我要展示的部分

    part 2

    /* An instance of this class will be registered as a JavaScript interface */
    class MyJavaScriptInterface
    {
        @SuppressWarnings("unused")
        public void processHTML(String html)
        {
            // process the html as needed by the app
        }
    }
    
    final WebView browser = (WebView)findViewById(R.id.browser);
    /* JavaScript must be enabled if you want it to work, obviously */
    browser.getSettings().setJavaScriptEnabled(true);
    
    /* Register a new JavaScript interface called HTMLOUT */
    browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
    
    /* WebViewClient must be set BEFORE calling loadUrl! */
    browser.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url)
        {
            /* This call inject JavaScript into the page which just finished loading. */
            browser.loadUrl("javascript:window.HTMLOUT.processHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
        }
    });
    
    /* load a web page */
    browser.loadUrl("http://example.com/gethtml.html"); 
    

但是当用户点击第二张图片中的按钮时,将调用HTTP post方法,这将是结果HTML
enter image description here

我的问题是如何在向用户展示之前检索和修改Post Result Html?并显示类似的内容 enter image description here

2 个答案:

答案 0 :(得分:1)

一个简单的解决方案可能是在webview中注入自定义css代码,改变你想要“单独”显示的HTML元素的样式。

你应该注入这样的css:

#central-box {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    width: 100%;
    // depends on the structure of the page
}

有关如何操作的示例,另请参阅in this answer

答案 1 :(得分:1)

我能想到至少有三种方法可以做到这一点,而且你真的很接近所有这些方法:

  1. 您已经对@lifeisfoo中的快速和脏方法有了大致的了解,尽管要处理GET和POST pre-API 21,您需要使用onPageCommitVisible(WebView视图,String url)。由于onPageFinished(WebView视图,String url)和shouldOverrideUrlLoading(WebView视图,String url)仅在GET请求上触发。
  2. 这就是为什么,直接来自SDK ...... ...&#34; onPageCommitVisible回调可用于确定使回收的WebView可见的安全点,确保不显示过时的内容。它最早被调用,可以保证onDraw(Canvas)将不再从先前的导航中提取任何内容。下一个绘图将显示WebView的背景颜色,或新加载页面的一些内容。&#34;它会在所有内容更新POST或GET上调用。

    1. 稍微好一点,您可以创建一个本地代理网页,其中包含javascript界面​​和其他有趣位,并存储为资源,如果您想要的内容被加载到全窗口iframe,您可以真正获得良好的控制,您可以使用onPageFinished与您的代理进行交互,因为它可以在iframe中使用onLoadResource与目标页面进行交互,使用旧的shouldInterceptRequest处理拦截,它返回WebResourceResponse并使用onFormResubmission处理POST驱动的更新。 / p>

    2. 最后,如果早于21的API支持不是一个大问题,最好的方法是使用新的shouldInterceptRequest,它接受新的WebResourceRequest对象,允许您为不同的请求类型指定不同的处理。 / p>

    3. 这里是新的WebResourceRequest对象的API链接和WebViewClient上的新的shouldInterceptRequest方法......

      http://developer.android.com/reference/android/webkit/WebResourceRequest.html

      http://developer.android.com/reference/android/webkit/WebViewClient.html#shouldInterceptRequest(android.webkit.WebView,android.webkit.WebResourceRequest)

      希望有所帮助:)