我想创建一个具有webview布局的android应用程序。这是我申请的标准:
第一次启动应用程序时,webview会加载一个网址(可能是facebook,google等等) webview.loadUrl( “http://www.google.com”);
加载网址后,应用程序会将加载的网址保存到Android内部存储中“特定位置”的HTML视图(file.htm)中。所以,假设我打开“google.com”,该应用程序将谷歌的网页保存为HTML文件(假设文件名为“google.htm”),当我转到“特定地点”并点击“谷歌”时.htm“文件,它使用Android的HTML查看器显示谷歌网页。
当应用程序再次启动时,或者只是说应用程序再次加载网址时(在本例中为“google.com”),它不会从“google.com”页面获取,但它取自内部存储android上的“google.htm”文件。因此,从用户的角度来看,该应用程序仍然可以加载网页,即使它没有连接到互联网。
为了简单起见,
任何人都可以帮我解释代码和解释吗?对此,我真的非常感激。谢谢你们:D
答案 0 :(得分:5)
您可以使用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);
}
}