Android開発--WebView,WebChromeClient,WebViewClient

11696 ワード


WebViewはAndroidアプリでhtmlページを処理するコンポーネントです
Webviewはandroidのブラウザコントロールで、一部の携帯電話アプリケーションではb/sモードでアプリケーションを開発することがよくありますが、このときwebviewの強力な機能が表示されます.
Webviewの何時設定
アクセス権の設定:.AndroidManifest.xmlではライセンス「android.permission.INTERNET」を使用する必要があります.そうしないと、Web page not availableエラーが発生します.
jsオープン設定:アクセスしたページにJavascriptがある場合は、webviewがJavascriptをサポートするように設定する必要があります.webview.getSettings().setJavaScriptEnabled(true); そうでないと、ページのjsは機能しません.
スクロールバーの設定:this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
キャッシュモードの設定:setCacheMode
 
    webView.getSettings().setJavaScriptEnabled(true);
  webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
  webView.setHorizontalScrollBarEnabled(false);
  webView.getSettings().setSupportZoom(true);
  webView.getSettings().setBuiltInZoomControls(true);
  webView.setInitialScale(70);
  webView.setHorizontalScrollbarOverlay(true);
 
WebViewは主に解析、レンダリングインタフェースを完了します.その他はイベント傍受オブジェクト(WebViewClient)に渡され、各種の通知、要求イベントを処理する.WebChromeClientは、WebViewJavascriptの処理を支援するダイアログ、Webサイトアイコン、Webサイトtitle、ロードの進捗など
 
 
 
WebView Clientは主にWebViewが各種の通知、要求イベントを処理することを支援します.例えば、次のようなものです.
shouldOverrideUrlLoading: web          ,     android           ,             ;
onLoadResource:       
onPageStart:        
onPageFinish:          
onReceiveError:        
onReceivedHttpAuthRequest:

       ,             browser   ,     Android   browser      ,     webview WebViewClient  。
    mWebView.setWebViewClient(new WebViewClient(){       
          public boolean shouldOverrideUrlLoading(WebView view, String url){       
                   view.loadUrl(url);       
                   return true;       
          }       
     }); 

 
 
WebChromeClientは主にWebViewがJavascriptのダイアログボックス、サイトアイコン、サイトtitle、ロードの進捗などを処理することを支援します.
onCloseWindow(  WebView)
onCreateWindow()
onJsAlert (WebView alert  ,    WebChromeClient    )
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle

 
リターン処理
何の処理もせずにWebページをブラウズし、システムの「Back」キーをクリックすると、Browser全体がfinish()を呼び出して自身を終了し、ブラウザーを出すのではなくブラウザーをブラウズしたい場合は、現在のActivityでこのBackイベントを処理し、消費する必要があります.
 public boolean onKeyDown(int keyCode, KeyEvent event) {       
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {       
            mWebView.goBack();       
            return true;       
        }       
        return super.onKeyDown(keyCode, event);       
    }

 
Javascripteカスタムオブジェクト0をサポート
 
addJavascriptInterface()メソッドでjsカスタムオブジェクトを追加したり、webページを使用して携帯電話javaプログラムと通信したりすることができます.
w 3 c規格ではjsにwindow,history,documentなどの標準オブジェクトがあり,ブラウザの開発時に自分でオブジェクトを定義して携帯電話システムの機能を呼び出して処理することができ,jsを使ってやりたい放題を行うことができる.
public class WebViewDemo extends Activity {        
             private WebView mWebView;       
             private Handler mHandler = new Handler();       
       
            public void onCreate(Bundle icicle) {       
                     super.onCreate(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");       
            }       
     }

addJavascriptInterface(Object obj,String interfaceName)という方法を見てみましょう.この方法はjavaオブジェクトをjavascriptオブジェクトにバインドし、javascriptオブジェクト名はinterfaceName(demo)、役割ドメインはGlobalです.これにより、ウェブビューを初期化すると、ウェブビューにロードされたページにjavascript:windowを直接通過することができる.demoはバインドされたjavaオブジェクトにアクセスしました.htmlでどのように呼び出されているか見てみましょう.
<html>       
     <mce:script language="javascript"><!--     
       
         function wave() {       
            document.getElementById("droid").src="android_waving.png";       
         }       
             
// --></mce:script>       
     <body>       
          <a onClick="window.demo.clickOnAndroid()">       
             <img id="droid" src="android_normal.png" mce_src="android_normal.png"/>
                Click me!       
          </a>       
     </body>       
</html>     

これによりjavascriptではjavaオブジェクトのclickOnAndroid()メソッドを呼び出すことができ、同様にこのオブジェクトに多くのメソッド(メールの送信、連絡先リストの呼び出しなどの携帯電話システム機能)を定義することができます.ここでwave()メソッドはjavaでjavascriptを呼び出す例である.
 
DownloadListenerインタフェース
このインタフェースには、onDownloadStart()がリスニングインタフェースをダウンロードし、クライアントコードがそのインタフェースを実装すると、ダウンロード開始、失敗、保留、完了などの場合、DownloadManagerCoreオブジェクトがクライアントコードで実装されたDownloadListenerメソッドを呼び出す方法があります.
 
ここにはいくつかの知識点があります.
1)WebViewがapkファイルからassetsをロードするために、Android SDKはschemaを提供し、接頭辞は「file:///android_asset/「.WebViewがこのようなschemaに遭遇したら、現在のパッケージのassetsディレクトリにコンテンツを探します.上のように」file:///android_asset/demo.html" 
2)addJavascriptInterfaceメソッドでバインドするJavaオブジェクトおよびメソッド別のスレッドを実行するには、構築するスレッドで実行できません.これもHandlerを使う目的です(今日はhandlerで処理していないので、webviewclientのonPageStartメソッドがaddJavascriptInterfaceのメソッドと競合し、二人の実行順序が常に入れ替わった後、handlder実装に変更され、その問題を解決するために、正しい順序はonPageStartがaddJavascriptInterfaceのhandlderイベント処理の前に実行されることです).
 
彼らにはいろいろな違いがあるように見えますが、実際に使うと、あなたのWebViewがhtmlのページ内容を処理するために使われているだけで、WebViewClientだけでいいので、JSや進捗バーなど、より豊富な処理効果が必要な場合はWebChromeClientを使います.
もっと多くの場合、あなたはこのようにすることができます.
WebView webView= (WebView) findViewById(R.id.webview);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
webView.getSettings().setJavaScriptEnabled(true);//WebViewによるJSのサポート
webView.loadUrl(url);
これでWebViewは理論的にほとんどの特徴を実現することができます
もちろん、もっと素晴らしい内容は自分で追加する必要があります.
 
 
例:
activity_web.xml:
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webView1" 
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

 
WebActivity.java:
 
public class WebActivity extends Activity {
	
    private static final String LOG_TAG = "WebViewDemo";  
    private WebView mWebView;  
    private Handler mHandler = new Handler(); 
    final Activity activity = this;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_web);

	mWebView = (WebView) findViewById(R.id.webView1);
		
	/**
	* webView   :WebViewClient  html
	*/
	mWebView.setWebViewClient(new WebViewClient() {
		//   WebViewClient  shouldOverrideUrlLoading  
                  (  :    html   webView   ,   Android   browser )
		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			view.loadUrl(url);
			return true;
		}

		//    
		public void onReceivedError(WebView view, int errorCode,
                                            String description, String failingUrl) { 
			// Handle the error
                  Toast.makeText(getApplicationContext(),"       ,     。",                                                  Toast.LENGTH_SHORT).show();
                }
	});
		
		
	/**
	* webView   :WebChromeClient  WebView  Javascript    ,    
	*/
	mWebView.setWebChromeClient(new MyWebChromeClient());
		
		
	/**
	* webView   :webview js        
	* ( w3c   js  window,history,document     ,
	*                                 )
	*/
	WebSettings webSettings = mWebView.getSettings();
	webSettings.setJavaScriptEnabled(true);
	webSettings.setSavePassword(false);
	webSettings.setSaveFormData(false);
	webSettings.setSupportZoom(false);
	/**webView   :webview js        ,   */
//	mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");

	/**webView   :webview js        ,   :*/
	mWebView.addJavascriptInterface(new Object() {       
            public void clickOnAndroid() {       
              mHandler.post(new Runnable() {       
                public void run() {                                                
                 mWebView.loadUrl("javascript:wave()");//  html    JS  wave()                      }       
              });       
            }       
        }, "demo");     
		
		
		
	mWebView.loadUrl("http://192.168.1.228:8080/ytj/index.html");
//	mWebView.loadUrl("http://183.129.157.219:8086/ytj/index.html");
//	mWebView.loadUrl("http://www.etongjin.com.cn/index.html");
   }
	

		
    /*
     * WebChromeClient  WebView   
     */
    final class MyWebChromeClient extends WebChromeClient {
	@Override
	//WebChromeClient  Javascript    
          (WebView alert        ,      WebChromeClient    )
	public boolean onJsAlert(WebView view, String url,
                                 String message,JsResult result){
		Log.d(LOG_TAG, message);
		result.confirm();
		return true;
	}
		
	//WebChromeClient     
	public void onProgressChanged(WebView view, int progress) {
		activity.setTitle("Loading...");
		activity.setProgress(progress * 100);
		if (progress == 100)
			activity.setTitle(R.string.app_name);
	}    
    }
	
	
    /*
     * webView   :webview js        ,   
     */
    final class DemoJavaScriptInterface {
	DemoJavaScriptInterface() { }
	public void clickOnAndroid() {
		mHandler.post(new Runnable() {
		   public void run() {
		      mWebView.loadUrl("javascript:wave()");//  html    JS  wave() 
		   }
		});
	}
    }
	
	
    /**
     * webView       (   ):
     *         ,    ,    “Back” ,  Browser   finish()     ;
     *                     ,     Activity        Back  
     */
     public boolean onKeyDown(int keyCode, KeyEvent event) {
	if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
		mWebView.goBack();
		return true;
	}
	return super.onKeyDown(keyCode, event);
     }
	
}