繁体   English   中英

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

[英]How to retrieve and modify HTML content from WebView with Http Post

我正在开发一个显示 HTML 页面某些部分的 android 应用程序。 对于第一步,我使用问题如何从 WebView 检索 HTML 内容中提供的此代码。

  • 完整的html图片

第1部分

  • 我想展示的那部分

    第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
在此处输入图片说明

我的问题是如何在向用户显示之前检索和修改 Post Result Html? 并展示这样的东西在此处输入图片说明

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

你应该像这样注入一个css:

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

有关如何执行此操作的示例,另请参阅此答案

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

  1. 您已经对来自@lifeisfoo 的快速和脏方法有了一个粗略的了解,尽管要处理 API 21 之前的 GET 和 POST 方法,您需要使用 onPageCommitVisible(WebView view, String url)。 由于 onPageFinished(WebView view, String url) 和 shouldOverrideUrlLoading (WebView view, String url) 仅在 GET 请求时触发。

这就是为什么,直接来自 SDK ......” onPageCommitVisible 回调可用于确定使回收的 WebView 可见的安全点,确保不显示陈旧的内容。它在最早的点被调用可以保证 onDraw(Canvas) 不会再从以前的导航中绘制任何内容。下一次绘制将显示 WebView 的背景颜色,或新加载页面的一些内容。 ”它被调用内容更新 POST 或 GET。

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

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

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

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)

希望有帮助:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM