3

我想制作一个具有 webview 布局的 android 应用程序。这是我申请的标准:

  1. 应用程序第一次启动时,webview 会加载一个 url(可能是 facebook、google 等) webview.loadUrl("http://www.google.com");

  2. 加载 url 后,应用程序将加载的 url 保存到 android 内部存储中“特定位置”的 HTML 视图 (file.htm)。因此,假设我打开“google.com”,应用程序将 google 的网页保存为 HTML 文件(假设文件名“google.htm”),当我转到那个“特定位置”并单击“google .htm" 文件,它使用 android 的 HTML 查看器显示 google 网页。

  3. 当应用程序再次启动时,或者简单地说应用程序再次加载 URL(在本例中为“google.com”),它不会从“google.com”页面获取,而是从“google.htm”获取内部存储android上的文件。因此,从用户的角度来看,该应用程序仍然可以加载网页,即使它没有连接到互联网。

为了简单起见,

  1. 应用程序开始->转到指定的url->检查存储
  2. 如果指定的 url 在存储中有 HTML 文件,则从存储中加载
  3. 否则它会从网络加载 url。

任何人都可以帮我提供代码和解释吗?对此,我真的非常感激。谢谢大家 :D

4

1 回答 1

7

当页面完成加载时,您可以使用 WebView 的 Javascript 接口返回整个 HTML 源代码。为此,您需要将自己的 WebViewClient 分配给 WebView。

为此,请在您的 Activity 类中使​​用类似于以下内容的内容——确保您的 Activity 实现了 Observer

public void onCreate(Bundle savedInstanceState) {
    // ...

    webView.setWebViewClient(new MyWebViewClient());
    HtmlJSInterface htmlJSInterface = new HtmlJSInterface();
    webView.addJavascriptInterface(htmlJSInterface, "HTMLOUT");
    htmlJSInterface.addObserver(this);

    // ...
}

// Called when our JavaScript Interface Observables are updated.
@Override
public void update(Observable observable, Object observation) {

    // Got full page source.
    if (observable instanceof HtmlJSInterface) {
        html = (String) observation;
        onHtmlChanged();
    }
}

private void onHtmlChanged() {
    // Do stuff here...
}

private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        // When each page is finished we're going to inject our custom
        // JavaScript which allows us to
        // communicate to the JS Interfaces. Responsible for sending full
        // HTML over to the
        // HtmlJSInterface...
        isStarted = false;
        isLoaded = true;
        timeoutTimer.cancel();
        view.loadUrl("javascript:(function() { "
                + "window.HTMLOUT.setHtml('<html>'+"
                + "document.getElementsByTagName('html')[0].innerHTML+'</html>');})();");
        }
    }
}

然后,您将要创建 HtmlJSInterface 类,如下所示:

   public class HtmlJSInterface extends Observable {
  private String html;

  /**
   * @return The most recent HTML received by the interface
   */
  public String getHtml() {
    return this.html;
  }

  /**
   * Sets most recent HTML and notifies observers.
   * 
   * @param html
   *          The full HTML of a page
   */
  public void setHtml(String html) {
    this.html = html;
    setChanged();
    notifyObservers(html);
  }
}
于 2012-05-31T14:55:08.880 回答