3

ウェブビューレイアウトのAndroidアプリを作りたいです。これが私のアプリケーションの基準です。

  1. アプリケーションが初めて起動すると、webviewはURL(Facebook、Googleなど)をロードします。webview.loadUrl( "http://www.google.com");

  2. URLをロードした後、アプリケーションはロードされたURLをAndroidの内部ストレージの「特定の場所」にあるHTMLビュー(file.htm)に保存します。たとえば、「google.com」を開くと、アプリケーションはGoogleのWebページをHTMLファイル(たとえば、ファイル名「google.htm」)に保存し、その「特定の場所」に移動して「google」をクリックするとします。 .htm "ファイル、AndroidのHTMLビューアを使用してGoogleのWebページを表示します。

  3. アプリケーションが再度起動するとき、または単にアプリケーションがURL(この場合は「google.com」)を再度ロードすると言う場合、「google.com」ページからは取得しませんが、「google.htm」から取得します。内部ストレージandroid上のファイル。したがって、ユーザーの視点から見ると、そのアプリケーションは、インターネットに接続されていなくてもWebページをロードできます。

簡単にするために、

  1. アプリケーションの開始->指定されたURLに移動->ストレージを確認します
  2. 指定されたURLがストレージにHTMLファイルを持っている場合は、ストレージからロードします
  3. それ以外の場合は、Webから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 に答える