WebViewの使い方

7154 ワード

キークラス
  • WebView
  • WebSettings
  • WebView Cient
  • WebChromeClient
  • WebViewの基本的な使い方:
    WebView myWebView = (WebView) findViewById(R.id.webview);
    myWebView.loadUrl("http://www.example.com");
    
    ロードがネットワークページである場合は、ネットワーク権限を申請する必要があります。
    
    
    追加
  • WebViewには他にも2つの方法があり、loadData(String data, String miniType,String edcoding)loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)が「data」しかロードできない場合があり、他のプロトコルのURLがロードできなくなり、ロードされたURLが必ずしも「data」ではない場合には、次の方法が推奨されます。
  • mimeType:データタイプ、例えば:text/html.
  • encoding:データ符号化方式base 64またはurl encoding.
  • baseUrl:ページのルートを指定します。
  • loadData()は、リソースロケータを統一し、URLは、リソース識別子を統一する。URIにはURLが含まれていますURIの一般的な文法URL
  • WebViewの設定
    WebViewを設定するには、まずWebSettingsオブジェクトを取得する必要があります。WebSettingsオブジェクトはscheme:[//[user:password@]host[:port]][/]path[?query][#fragment]によって獲得されるのではなく、WebViewを作成すると、デフォルトのWebSettingsオブジェクトが得られます。このWebSettingオブジェクトはnewによって得ることができる。
    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    
    WebViewを通じて一つのページをロードした時、ページのリンクをクリックすると、ダイアログが開きます。どのブラウザを通じて開くかを選択します。もし直接に自分のWebViewで開けたいなら、次のような方法で実現できます。
    myWebView.setWebViewClient(new WebViewClient());  
    
    WebViewリソース要求を遮断する
    私たちは自分のWebViewに関する要求を処理したくない場合があります。例えば、ページにメール、電話、メッセージなどのリンクがある場合、ユーザーがクリックした後に第三者のアプリケーションを起動してほしいです。私たち自身のWebView処理ではなく、次のように実現できます。
    まず、私は一つのhtml文書をmyWebView.getSettings()ディレクトリの下に置いています。main/assetsディレクトリの下ではないので注意してください。ウェブページをシミュレートします。html文書は以下の通りです
    
    
    
        WebView Test
        
        
        
            var new_activity = function(){
                android.newActivity();
            }
    
            var send_notification = function(){
                android.sendNotification();
            }
    
             window.onload = function(){
                alert("alert from javascript");
            }
        
    
    
    

    send email

    コール

    sendメッセージ

    javaコードにおいてWebView Clientを書き換えるres/方法は、shouldOverrideUrlLoading(WebView view, String url)に戻り、この方法を書き換えたことを示し、今回の要求は自分のtrueで処理されず、第三者アプリケーションを呼び出す。
    //   url   。
    String url = "file:///android_asset/index_test.html";
    myWebView.setWebViewClient(new WebViewClient(){
        @Override
          public boolean shouldOverrideUrlLoading(WebView view, String url) {
             Uri uri = Uri.parse(url);
             if ("mailto".equalsIgnoreCase(uri.getScheme())
                  ||"tel".equalsIgnoreCase(uri.getScheme())
                  ||"sms".equalsIgnoreCase(uri.getScheme())){
              //    Intent Action   。      
              Intent intent=new Intent(Intent.ACTION_VIEW, uri);
              startActivity( intent);
              return true;
              }
            return false;
          }
    });
    myWebView.loadUrl(url);
    
    追加
  • 私たちはウェブページのいくつかのリソースをブロックしたい場合、Web View ClientのWebView方法を書き換える必要がありますが、shouldIntercepterRequest()を書き換えるのは効果がありません。ウェブページのリソースは「IO」スレッドにロードされているため、shouldOverrideUrlLoadingはメインスレッドで実行され、新しいshouldOverrideUrlLoadingオブジェクト、つまりページが書き換えられてロードされる必要がある場合にのみリロードされます。URL方法は、shouldIntercepterRequestスレッド内で動作し、リソース要求をブロックし、他のリソースを返すことができる。
  • 画像のロードを禁止するIO
  • ページの読み込みエラーが発生した場合、webSettings.setLoadsImagesAutomatically(false)WebViewClient方法を書き換えることができる。
  • JavaScriptとWebViewの相互作用
    Javascriptを呼び出します。
    直接呼び出し
    myWebView.loadUrl("javascript:alert(java to javascript)");  
    
    追加的に、onReceivedError()方法によって、戻り値を伴うjs方法を処理しても良い。
    WebChromeCientをリロードして呼び出します。
    注意上のHtmlコードは、ページ読み込み時にポップアップダイアログがあります。WebViewの設定にはevaluateJavascriptが与えられていますが、WebViewはまだダイアログが表示されません。以下の方法でダイアログが表示されます。
    myWebView.setWebChromeClient(new WebChromeClient());
    
    setJavaScriptEnabled(true)WebChromeClientは何が違いますか?前者は主にJSを補助し、ページの内容と対話する。後者は主にページローディング中のイベント通知を担当します。
    もしこのシャッターが本当に見苦しいと思ったら、私達は次のような方法でカスタムできます。
    myWebView.setWebChromeClient(new WebChromeClient(){
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        Toast.makeText(MainActivity.this,message,Toast.LENGTH_SHORT).show();
        result.confirm();
        return true;
        }
    });
    
    Javascript呼び出しjava
    主にWebViewClientを通じて、Javascriptにオブジェクトとオブジェクトの名前を注入する。appi 17以下では、addJavascriptInterface(Object object,String name)すべての方法が注入され、appi 17以上ではpublicの注釈が付加された方法のみが注入される。
    まずクラスを作ります。次のように。
    public class WebAppInterface {
        private Context mContext;
        private final static int NOTIFICATION_ID = 1;
    
        public WebAppInterface(Context c) {
            mContext = c;
        }
    //   html     
        @JavascriptInterface
        public void newActivity(){
            Intent intent = new Intent(mContext,JSActivity.class);
            mContext.startActivity(intent);
        }
    //   html      
        @JavascriptInterface
        public void sendNotification(){
            Notification notification = new NotificationCompat.Builder(mContext)
                    .setContentTitle("hello")
                    .setContentText("this notification is sent by js")
                    .setSmallIcon(R.drawable.notification_icon)
                    .setAutoCancel(true)
                    .setDefaults(Notification.DEFAULT_ALL)
                    .build();
            NotificationManager manager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
            manager.notify(NOTIFICATION_ID,notification);
        }
    }
    
    このjsインターフェースをWebViewに追加します。
    myWebView.addJavascriptInterface(new WebAppInterface(mContext),"android");  
    
    その後、上記の2つの方法をjsで呼び出すことができます。詳細は上のhtmlファイルを参照してください。
    WebViewミニ開発
    もし私達はユーザーがWebViewの中のリンクをクリックしてジャンプしたくないならば、リターンキーを押して直接アプリケーションを退出して、Activityの中で@JavascriptInterface方法を書き換えることができます。
    @Override
        public void onBackPressed() {
            if (myWebView.canGoBack()){
                myWebView.goBack();
            }else {
                super.onBackPressed();
            }
        }     
    
    WebViewデバッグテクニック
    下記のコードを追加します
    if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.KITKAT && BuildConfig.DEBUG){
       myWebView.setWebContentsDebuggingEnabled(true);
    }
    
    chromeブラウザにonBackPressを入力します。