目次
js との相互変調
WebView获取服务器中的 session 问题
WebView清除本地cookies
ホームページ ウェブフロントエンド htmlチュートリアル Android_html/css_WEB-ITnose での WebView のいくつかの使用方法

Android_html/css_WEB-ITnose での WebView のいくつかの使用方法

Jun 21, 2016 am 08:47 AM

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);}
ログイン後にコピー

js との相互変調

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 でどのように動作するかを見てみましょう。 >

<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 を使用する目的でもあります。

js で Android コードを呼び出します。

まず、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 キャッシュ

プロジェクトで WebView コントロールが使用されている場合、 HTML ページがロードされると、データベースとキャッシュの 2 つのファイルが /data/data/ パッケージ名フォルダーに生成されます。

要求された URL レコードは WebViewCache.db に保存され、URL のコンテンツは WebViewCache フォルダーに保存されます。自分で試して、HTML ファイルを定義し、その中に画像を表示して、WebView を使用することができます。それをロードし、キャッシュから画像を読み取って表示してみます。

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");
ログイン後にコピー

WebView は 404 エラーを処理します

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();  }}
ログイン後にコピー

WebView がスクロールしたかどうかを確認します。ページの下部

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}
ログイン後にコピー

WebView获取服务器中的 session 问题

接下来我们讲如下两个问题:

Android 中的 WebView 如何获取服务器页面的 jsessionid 的值

Android 的 WebView 又是如何把得到的 jsessionid 的值在 set 到服务器中,一致达到他们在同一个 jsessionid 的回话中.

其实非常非常简单,只不过是几个方法罢了:

CookieManager cm = CookieManager.getInstance(); cm.removeAllCookie();cm.getCookie(url);cm.setCookie(url, cookie);
ログイン後にコピー

另外还有个 CookieSyncManager,也许你会在一些旧的项目中看到它。从名字来理解,它实际上应该是一个异步缓存器。不过我们看到这个方法已经被标记为过时了,查看源码可以看到过时原因是现在WebView已经是自动的异步缓存了,所以这个类已经没有存在的意义了。 CookieSyncManager

WebView清除本地cookies

首先,要清除肯定要会添加,这里给大家提供一个工具方法:

/***     * 如果用户已经登录,则同步本地的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();
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

&lt; Progress&gt;の目的は何ですか 要素? &lt; Progress&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:34 PM

この記事では、HTML&lt; Progress&gt;について説明します。要素、その目的、スタイリング、および&lt; meter&gt;との違い要素。主な焦点は、&lt; Progress&gt;を使用することです。タスクの完了と&lt; Meter&gt; statiの場合

&lt; datalist&gt;の目的は何ですか 要素? &lt; datalist&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:33 PM

この記事では、HTML&lt; Datalist&GT;について説明します。オートコンプリートの提案を提供し、ユーザーエクスペリエンスの改善、エラーの削減によりフォームを強化する要素。

HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? Mar 17, 2025 pm 12:20 PM

記事では、HTML5クロスブラウザーの互換性を確保するためのベストプラクティスについて説明し、機能検出、プログレッシブエンハンスメント、およびテスト方法に焦点を当てています。

&lt; meter&gt;の目的は何ですか 要素? &lt; meter&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:35 PM

この記事では、html&lt; meter&gt;について説明します。要素は、範囲内でスカラーまたは分数値を表示するために使用され、Web開発におけるその一般的なアプリケーション。それは差別化&lt; Meter&gt; &lt; Progress&gt;およびex

HTML5&lt; time&gt;を使用するにはどうすればよいですか 日付と時刻を意味的に表す要素? HTML5&lt; time&gt;を使用するにはどうすればよいですか 日付と時刻を意味的に表す要素? Mar 12, 2025 pm 04:05 PM

この記事では、html5&lt; time&gt;について説明します。セマンティックデート/時刻表現の要素。 人間の読み取り可能なテキストとともに、マシンの読みやすさ(ISO 8601形式)のDateTime属性の重要性を強調し、Accessibilitを増やします

HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? Mar 17, 2025 pm 12:27 PM

この記事では、ブラウザのユーザー入力を直接検証するために、必要、パターン、MIN、MAX、および長さの制限などのHTML5フォーム検証属性を使用して説明します。

ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? Mar 20, 2025 pm 05:56 PM

この記事では、モバイルデバイスのレスポンシブWebデザインに不可欠なViewportメタタグについて説明します。適切な使用により、最適なコンテンツのスケーリングとユーザーの相互作用が保証され、誤用が設計とアクセシビリティの問題につながる可能性があることを説明しています。

&lt; iframe&gt;の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? &lt; iframe&gt;の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? Mar 20, 2025 pm 06:05 PM

この記事では、&lt; iframe&gt;外部コンテンツをWebページ、その一般的な用途、セキュリティリスク、およびオブジェクトタグやAPIなどの代替案に埋め込む際のタグの目的。

See all articles