ホームページ > 記事 > ウェブフロントエンド > Android_html/css_WEB-ITnose での WebView のいくつかの使用方法
Android システムには高性能 Webkit カーネル ブラウザが組み込まれており、WebView と呼ばれるコンポーネントとして SDK にカプセル化されています。
開発プロセスでは、いくつかの点に注意する必要があります。
1. これは、ネットワーク権限にアクセスするために追加する必要がある最も基本的な AndroidManifest.xml です。
2. アクセスするページに Javascript が含まれている場合、WebView は Javascript をサポートするように設定する必要があります。
WebView.getSettings().setJavaScriptEnabled(true);
3. ページ内にリンクがある場合、新しく開いた Android システム ブラウザーでリンクに応答するのではなく、リンクをクリックして現在のブラウザーで応答し続ける場合は、 WebView の WebViewClient オブジェクトをオーバーライドする必要があります。
mWebView.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url){ view.loadUrl(url); return true; }});
4. 何も処理を行わない場合は、Web ページを閲覧してシステムの「戻る」ボタンをクリックすると、ブラウザ全体がfinish() を呼び出して Web ページ自体を終了します。ブラウザを起動するのではなく戻るために閲覧している場合、Back イベントは現在のアクティビティで処理および消費される必要があります
public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event);}
Web ページを表示できるため, もちろん、Web ページでもローカル メソッドを操作できます。 (1行では書ききれなかったのでインデントを調整しました)
public class WebViewDemo extends Activity { private WebView mWebView; private Handler mHandler = new Handler(); public void onCreate(Bundle icicle) { setContentView(R.layout.WebViewdemo); mWebView = (WebView) findViewById(R.id.WebView); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new Object() { public void clickOnAndroid() { mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:wave()"); } }); } }, "demo"); mWebView.loadUrl("file:///android_asset/demo.html"); }}
java オブジェクトを javascript オブジェクトにバインドする addJavascriptInterface(Object obj, String InterfaceName) メソッドを見てみましょう。オブジェクト名はinterfaceName (demo)、スコープは Global です。WebView を初期化した後、WebView によって読み込まれたページ内の javascript:window.demo を介してバインドされた Java オブジェクトに直接アクセスできます。
<html><script language="javascript"> function wave() { document.getElementById("droid").src="android_waving.png"; }</script><body> <a onClick="window.demo.clickOnAndroid()"> <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br> Click me! </a></body></html>このようにして、Java オブジェクトの clickOnAndroid() メソッドを JavaScript で呼び出すことができます。同様に、このオブジェクトで多くのメソッド (テキスト メッセージの送信、連絡先リストや他のモバイルへの呼び出しなど) を定義できます。
ここでの wave() メソッドは、Java で JavaScript を呼び出す例です。
1 点説明する必要があります。addJavascriptInterface メソッドでバインドされる Java オブジェクトとメソッドは別のスレッドで実行する必要があります。コンストラクターでは実行できません。スレッドでは、これが Handler を使用する目的でもあります。
まず、WebView、WebViewClient、WebChromeClient の違いを簡単に説明します。
WebView の設計では、WebView クラスがすべてを行う必要はなく、WebView が WebViewClient の処理を支援するために、WebView が独自の解析およびレンダリング作業に集中できるように、一部の作業を他のタスクに割り当てます。 WebChromeClient は、JavaScript ダイアログ ボックス、Web サイトのアイコン、Web サイトのタイトルを処理するための Assist WebView です。
関数の実装:
Android で WebView を使用して HTML Web ページを読み込みます。 、HTML Web ページでボタンを定義し、ボタンをクリックしてトーストをポップアップ表示します。
実装手順:
まずインターフェイス クラスを定義し、コンテキスト オブジェクトを渡し、インターフェイスクラスのjsで実装されるメソッド。
次に、assets リソース パッケージの下に html ファイルを定義し、そのファイル内にボタンのクリック イベントを js 関数として定義します。
次に、WebView コンポーネントを xml で定義します。 、アクティビティ クラスで WebView を取得し、WebView パラメーターを設定します。ここでは、WebView が js をサポートするように設定し、定義された js インターフェイス クラスを WebView に追加することに特に注意してください。その後、インターフェイス クラスで定義された関数を使用できるようになります。
myWebView.getSettings().setJavaScriptEnabled(true);myWebView.addJavascriptInterface(new JavaScriptinterface(this),”android”);
WebView を使用してローカル HTML ファイルをロードする最後の方法は次のとおりです:
myWebView.loadData(htmlText,"text/html", "utf-8");
ここでの htmltext は、アセットを形式で読み取ります。
WebView のキー監視を設定し、期限切れのリターン キーを監視し、有効期限が切れたかどうかを判断します。 Web ページに戻ることができ、WebView の goBack() を使用して前のページに戻ります。
プロジェクトで WebView コントロールが使用されている場合、 HTML ページがロードされると、データベースとキャッシュの 2 つのファイルが /data/data/ パッケージ名フォルダーに生成されます。
要求された URL レコードは WebViewCache.db に保存され、URL のコンテンツは WebViewCache フォルダーに保存されます。自分で試して、HTML ファイルを定義し、その中に画像を表示して、WebView を使用することができます。それをロードし、キャッシュから画像を読み取って表示してみます。
実際、キャッシュが保存されている場所はすでにわかっているため、削除はキャッシュを取得して削除するだけです。
//删除保存于手机上的缓存private int clearCacheFolder(File dir,long numDays) { int deletedFiles = 0; if (dir!= null && dir.isDirectory()){ try { for (File child:dir.listFiles()){ if (child.isDirectory()) { deletedFiles += clearCacheFolder(child, numDays); } if (child.lastModified() < numDays) { if (child.delete()) { deletedFiles++; } } } } catch(Exception e) { e.printStackTrace(); } } return deletedFiles; }
キャッシュ機能を有効にするかどうかも制御できます
//优先使用缓存: WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //不使用缓存: WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
アプリケーション終了時に以下のコードを追加してキャッシュを完全にクリアします
File file = CacheManager.getCacheFileBaseDir(); if (file != null && file.exists() && file.isDirectory()) { for (File item : file.listFiles()) { item.delete(); } file.delete(); } context.deleteDatabase("WebView.db"); context.deleteDatabase("WebViewCache.db");
Web ページを表示するときに発生するもう 1 つの問題は、Web ページが見つからないことです。もちろん、WebView はこれを処理することもできます。
public class WebView_404 extends Activity { private Handler handler = new Handler() { public void handleMessage(Message msg) { if(msg.what==404) {//主页不存在 //载入本地 assets 文件夹下面的错误提示页面 404.html web.loadUrl("file:///android_asset/404.html"); }else{ web.loadUrl(HOMEPAGE); } } }; @Override protected void onCreate(Bundle savedInstanceState) { web.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrl(WebView view,String url) { if(url.startsWith("http://") && getRespStatus(url)==404) { view.stopLoading(); //载入本地 assets 文件夹下面的错误提示页面 404.html view.loadUrl("file:///android_asset/404.html"); }else{ view.loadUrl(url); } return true; } }); new Thread(new Runnable() { public void run() { Message msg = new Message(); //此处判断主页是否存在,因为主页是通过 loadUrl 加载的, //此时不会执行 shouldOverrideUrlLoading 进行页面是否存在的判断 //进入主页后,点主页里面的链接,链接到其他页面就一定会执行 shouldOverrideUrlLoading 方法了 if(getRespStatus(HOMEPAGE)==404) { msg.what = 404; } handler.sendMessage(msg); }).start(); }}
View には getScrollY() メソッドがあり、現在表示されている領域の上部とページ全体の上部の間の距離、つまり現在のコンテンツのスクロールの距離を返すことができます。
現在の View コンテナの高さを返す getHeight() または getBottom() メソッドもあります
ViewView には、コンテナ全体の高さを返すことができる getContentHeight() メソッドもありますhtml ページですが、WebView にはズーム機能があるため、現在のページ全体の高さとは一致しません。次のコードを使用して、WebView のズーム機能を有効または無効にできます。
mWebView.getSettings().setSupportZoom(true);mWebView.getSettings().setBuiltInZoomControls(true);
所以当前整个页面的高度实际上应该是原始 html 的高度再乘上缩放比例. 因此,更正后的结果 ,准确的判断方法应该是:
// 如果已经处于底端if(WebView.getContentHeight*WebView.getScale() -(webvi ew.getHeight()+WebView.getScrollY())){ //XXX}
接下来我们讲如下两个问题:
Android 中的 WebView 如何获取服务器页面的 jsessionid 的值
Android 的 WebView 又是如何把得到的 jsessionid 的值在 set 到服务器中,一致达到他们在同一个 jsessionid 的回话中.
其实非常非常简单,只不过是几个方法罢了:
CookieManager cm = CookieManager.getInstance(); cm.removeAllCookie();cm.getCookie(url);cm.setCookie(url, cookie);
另外还有个 CookieSyncManager,也许你会在一些旧的项目中看到它。从名字来理解,它实际上应该是一个异步缓存器。不过我们看到这个方法已经被标记为过时了,查看源码可以看到过时原因是现在WebView已经是自动的异步缓存了,所以这个类已经没有存在的意义了。 CookieSyncManager
首先,要清除肯定要会添加,这里给大家提供一个工具方法:
/*** * 如果用户已经登录,则同步本地的cookie到webview中 */ public void synCookies() { if (!CacheUtils.isLogin(this)) return; CookieSyncManager.createInstance(this); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); cookieManager.removeSessionCookie();//移除 String cookies = PreferenceHelper.readString(this, AppConfig.COOKIE_KEY, AppConfig.COOKIE_KEY); KJLoger.debug(cookies); cookieManager.setCookie(url, cookies); CookieSyncManager.getInstance().sync(); }
在使用网页版淘宝或百度登录时,WebView会自动登录上次的帐号!(因为WebView 记录了帐号和密码的cookies) 所以,需要清除 SessionCookie也是有必要的。
那么CookieManager同样也为我们提供了清除cookie的方法
CookieManager.getInstance().removeSessionCookie();
这里顺便说一下WebView本身也是会记录html缓存的,webview本身就提供了清理缓存的方法,其中参数true是指是否包括磁盘文件也一并清除:
webview.clearCache(true);webview.clearHistory();