Android WebView学習ノート


まずWebViewの継承関係を見てください.
ウェストビュー
extends Absoluute Layout
implements View TreeObserver.OnGlobal Focus Change Listener View Group.OHerarchyChange Listener
java.lang.Object  ↳android.view.View    ↳android.view.View Group      ↳android.widget.Absoluute Layout        ↳android.webkit.WebView
  • 権限を追加しなければなりません.
  • デフォルトの場合、WebViewはブラウザのようなコントロールを提供しないで、JavaScriptを起動しないで、ウェブページのエラーを無視します.ユーザーにウェブページを表示したいだけなら、ユーザー同士の対話が必要ではないです.WebViewというコントロールがいいかもしれません.しかし、もしあなたが成熟したウェブブラウザ機能を必要とするなら、Web Viewではなく、URL Intentを通じてシステムブラウザプログラムを起動したほうがいいです.
  •  Uri uri = Uri.parse("http://www.example.com");
     Intent intent = new Intent(Intent.ACTION_VIEW, uri);
     startActivity(intent);
    WebViewのいくつかのカスタムポイント:
  • WebChromeClientサブクラスを作成して設定します.補助WebViewはJavascriptのダイアログ、ウェブサイトのアイコン、ウェブサイトのtitle、ロードの進捗などを処理します.例えば、onJs Alert、onPrograess Changedなどです.
  • WebView Cientサブクラスを作成して設定します.補助WebViewは内容をレンダリングします.例えば、onPageStartd、onPageFinished、エラー情報を処理し、フォームを再提出します.ShuldOverrideUrlLoadingを通じて()もできます. ブロックURLをロードします
  • Web設定を変更します.例えば、set JavaScript Evaled()により、JavaScriptが有効になります.
  • は、addJavascript Interface(Object、String)を通じて、 WebViewにJavaオブジェクトを注入する.このようにウェブページの中のJavaScriptコンテキストはその対象を操作することができます.
  • ちょっと複雑な例があります.エラー情報、設定、進捗ヒントを示します.
    // Let's display the progress in the activity title bar, like the
     // browser app does.
     getWindow().requestFeature(Window.FEATURE_PROGRESS);
    
     webview.getSettings().setJavaScriptEnabled(true);
    
     final Activity activity = this;
     webview.setWebChromeClient(new WebChromeClient() {
       public void onProgressChanged(WebView view, int progress) {
         // Activities and WebViews measure progress with different scales.
         // The progress meter will automatically disappear when we reach 100%
         activity.setProgress(progress * 1000);
       }
     });
     webview.setWebViewClient(new WebViewClient() {
       public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
         Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
       }
     });
    
     webview.loadUrl("http://developer.android.com/");
            Androidは、実際の密度を3つの広義的な密度ハイ、medium、and lowに帰する.Androidは異なる解像度の画面に対応するようにウェブページを拡大・縮小しますので、高密度スクリーンは1.5倍、低密度は0.75倍に拡大・縮小されます.Android 2.0は最初からDOM、CSS、and metaをサポートしています.これで解像度をコントロールすることができます.
            AndroidはHTML 5 Videoにも対応しています.しかし、ハードウェアを開けて加速し、WebChromeClientを設定する必要があります.
    いくつかの一般的な方法:
    void addJavascript Interface(Object object、String name)    Inject the supplied Java oject into this WebView.はWebViewにJavaオブジェクトを注入する.
        object:the Java object to inject into this WebView's JavaScript context.Null values are ignored.WebViewのJavaオブジェクトに注入します.    name:the name used to expose the object in JavaScript.javaScriptに必要な名前を暴露します.
    bootlean canGoBack()    Gets whether this WebView has a back history item.このWebViewにはバックバックバックの履歴がありますか?    Gets whether the page can go back or forward the given number of steps.このページの手はバックしたりステップしますか?bootlean canGoForward()    Gets whether this WebView has a forward history item.このWebViewには前進した歴史項目がありますか?
    void clear History()    Tells this WebView to clear its internal back/forward list.WebViewにその返品/前進履歴リストをクリアするように通知します.
    void clearView()    This method was deprecated in API level 18.Use WebView.loadUrl(「about:blank」)to reliably reet the view state and release page reource(including any running JavaScript).API 18以上はこの方法を放棄します.
    void documenthas Images(Message reponse)    Queries the document to see if it contains any image references.ドキュメントを調べて、画像参照が含まれているかどうかを確認します.
    Sttic String findAddress(String addr)    Gets the first substring consisting of the address of a physical location.物理アドレスを含む最初のサブシリアルint findAllを取得する.    This method was deprecated in API level 16.findAllAsync(String)is preferred.API 16以上はこの方法を放棄して、findAllAsync(String)void findAllAsync(String find)を偏愛します.    Finds all instances of find on the page and highlights them,asynch ronously.非同期にページのインスタンスを見つけてハイライトします.
    int get ContentHeight()    Gets the height of the HTML content.HTMLコンテンツの高さを取得します.
    Bitmap get Favicon()    Gets the favicon for the current page.現在のページのアイコンを取得します.
    void loadData(String data,String mimeType,String encoding)    Loads the given data into this WebView using a'data'scheme URL.dataモードのURLでdataデータをWebView形式で表示します.void loadData WithBaseURL(String baseUrl,String data,String mimeType,String encoding,String historyUrl)    Loads the given data into this WebView,using baseUrl as the base URL for the content.与えられたデータをこのWebViewにロードします.このコンテンツの初期URLとしてbaseUrlを使用する.void loadUrl(String url)    Loads the given URL.urlロケータを通じてウェブページにロードします.void loadUrl(String url,Map<String, String>additional HttpHeaders)    Loads the given URL with the specified additional HTTP headers.は、追加のHTTPヘッダが指定されているurlページをロードします.
    定数:
    public static final String SCHEME_GEO    URI scheme for map address.地理座標    Contnt Value:「geo:0,0?q=」
    public static final String SCHEME_MAILO    URI scheme for email address.メールアドレス    コンスタントValue:「malto:」
    public static final String SCHEME_TEL    URI scheme for telephone number.電話番号    コンスタントValue:「ホテル:」
    WebViewで使ういくつかのテクニック:
    ①システムブラウザを開くのではなく、ウェブページを埋め込む.
    mWebView.setWebViewClient(new WebViewClient(){
          @Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
              view.loadUrl(url); return true;
          }
    });
    ②戻るキーを押すと、プログラムを終了せずに前のページに戻ります.
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    	if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView .canGoBack()) {
    		webview.goBack();
    		return true;
    	}
    	return super.onKeyDown(keyCode, event);
    }
    ③ユーザが入力したい場合は、フォーカスを取得する必要があります.
    webview.requestFocusFromTouch();
    ④その他の制御
    //          
    web.getSettings().setSupportZoom(true); 
    //          
    web.getSettings().setBuiltInZoomControls(true);
    //       
    web.getSettings().setUseWideViewPort(true);
    //     
    web.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
    web.getSettings().setLoadWithOverviewMode(true);
    例:
    public class MainActivity extends Activity {
    
    	WebView wv_notice;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		wv_notice = (WebView) this.findViewById(R.id.wv_notice);
    		wv_notice.getSettings().setJavaScriptEnabled(true);
    		wv_notice.setWebViewClient(new WebViewClient() {
    
    			@Override
    			public boolean shouldOverrideUrlLoading(WebView view, String url) {
    				// TODO Auto-generated method stub
    				view.loadUrl(url);
    				return true;
    			}
    
    			@Override
    			public void onReceivedError(WebView view, int errorCode,
    					String description, String failingUrl) {
    				// TODO Auto-generated method stub
    				super.onReceivedError(view, errorCode, description, failingUrl);
    				//Toast.makeText(MainActivity.this, "Oh no! " + description, Toast.LENGTH_SHORT).show();
    			}
    
    		});
    		StringBuffer sb = new StringBuffer("<html><head><title>    </title></head>");
    		sb.append("<body>  body  body  body  body  body  body  body  body  body  body  body<br>").append("<img src=\"http://img03.3dmgame.com/uploads/allimg/141115/271_141115025804_1_lit.jpg\"/>").append("</body></html>");
    		wv_notice.loadDataWithBaseURL(null, sb.toString(), "text/html", "utf-8", null);
    	}
    	@Override  
    	public boolean onKeyDown(int keyCode, KeyEvent event) {  
    	    if ((keyCode == KeyEvent.KEYCODE_BACK) && wv_notice.canGoBack()) {  
    	    	wv_notice.goBack();
    	        return true;
    	    }
    	    return super.onKeyDown(keyCode, event);  
    	}  
    }