Как получить и изменить содержимое HTML из WebView с помощью Http Post

Я разрабатываю приложение для Android, которое показывает часть HTML-страницы. Для первого шага я использую этот код, представленный под вопросом Как получить HTML-контент из WebView,

  • Изображение полного html

часть 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
введите описание изображения здесь

Мой вопрос заключается в том, как извлекать и изменять Post Hult результат результата перед показом пользователю? и показать что-то вроде этого введите описание изображения здесь

Ответ 1

Простое решение может заключаться в том, чтобы ввести собственный CSS-код внутри вашего веб-браузера, изменив стиль HTML-элемента, который вы хотите отобразить "в одиночку".

Вы должны ввести css следующим образом:

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

См. также в этом ответе для примера того, как это сделать.

Ответ 2

Есть как минимум три способа сделать это, о чем я могу думать, и вы действительно близки ко всем из них:

  • У вас уже есть приблизительное представление о быстром и грязном методе, начиная с @lifeisfoo, хотя для обработки как GET, так и POST pre-API 21 вам нужно будет использовать onPageCommitVisible (представление WebView, строковый URL-адрес). Поскольку onPageFinished (представление WebView, строковый url) и shouldOverrideUrlLoading (представление WebView, строковый URL) запускаются только по запросам GET.

Вот почему, прямо из SDK... ... "onPageCommitVisible callback можно использовать для определения точки, в которой можно безопасно сделать видимым переработанный WebView, гарантируя, что не будет отображаться нестойкий контент. Он вызывается в самый ранний момент, когда можно гарантировать, что onDraw (Canvas ) больше не будет выводить какой-либо контент из предыдущих навигаций. Следующий розыгрыш отобразит либо цвет фона WebView, либо часть содержимого загруженной страницы". он вызвал все обновления контента POST или GET.

  1. Чуть лучше, вы можете создать локальную прокси-страницу с интерфейсом javascript и другими забавными битами, уже существующими и сохраненными в качестве ресурса, если содержимое, которое вы хотите загрузить, загружается в полноэкранный iframe, вы можете получить действительно хороший контроль, вы можете взаимодействовать с вашим прокси-сервером, используя onPageFinished, так как он в iframe вы можете взаимодействовать с целевой страницей с помощью onLoadResource, обрабатывать перехват, используя старый mustInterceptRequest, который возвращает WebResourceResponse и обрабатывает обновления, связанные с POST, используя onFormResubmission.

    /li >
  2. Наконец, если поддержка API раньше, чем 21, не является большой проблемой, лучшим способом было бы использовать новый mustInterceptRequest, который принимает новый объект WebResourceRequest, который позволяет вам указывать различную обработку для разных типов запросов.

Здесь API-ссылки для нового объекта WebResourceRequest и нового метода shouldInterceptRequest на WebViewClient...

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)

надеюсь, что поможет:)