Android WebView总结

一个WebView的简单例子 。
在开发过程当中应该注意几点:
    1.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",不然会出Web page not available错误。
    2.若是访问的页面中有Javascript,则webview必须设置支持Javascript。
        webview.getSettings().setJavaScriptEnabled(true); 
    3.若是页面中连接,若是但愿点击连接继续在当前browser中响应,而不是新开Android的系统browser中响应该连接,必须覆盖 webview的WebViewClient对象。
mWebView.setWebViewClient(new WebViewClient(){       
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {       
                        view.loadUrl(url);       
                        return true;       
                    }       
        });  
mWebView.setWebViewClient(new WebViewClient(){    
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {    
                        view.loadUrl(url);    
                        return true;    
                    }    
        });
 4.若是不作任何处理,浏览网页,点击系统“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);       
    }    
public boolean onKeyDown(int keyCode, KeyEvent event) {    
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {    
            mWebView.goBack();    
                   return true;    
        }    
        return super.onKeyDown(keyCode, event);    
    }  
 
下一步让咱们来了解一下android中webview是如何支持javascripte自定义对象的,在w3c标准中js有 window,history,document等标准对象,一样咱们能够在开发浏览器时本身定义咱们的对象调用手机系统功能来处理,这样使用js就能够 随心所欲了。
  看一个实例:
view plaincopy to clipboardprint?
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");       
    }       
}  
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。这样初始化webview后,在webview加载的页面中就能够直接经过 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"/><br>       
                                Click me!       
            </a>       
        </body>       
</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"/><br>    
                                Click me!    
            </a>    
        </body>    
</html>   
这样在javascript中就能够调用java对象的clickOnAndroid()方法了,一样咱们能够在此对象中定义不少方法(比 如发短信,调用联系人列表等手机系统功能。),这里wave()方法是java中调用javascript的例子。
这里还有几个知识点:
1)为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为" file:///android_asset/"。WebView遇到这样的schema,就去当前包中的 assets目录中找内容。如上面的" file:///android_asset/demo.html"
2)addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用 Handler的目的。
 
 
 
总结:
一、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",不然会出Web page not available错误。
    二、在要Activity中生成一个WebView组件:WebView webView = new WebView(this);
    三、设置WebView基本信息:
          若是访问的页面中有Javascript,则webview必须设置支持Javascript。
          webview.getSettings().setJavaScriptEnabled(true); 
          触摸焦点起做用
          requestFocus();
          取消滚动条
          this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
    四、设置WevView要显示的网页:
          互联网用:webView.loadUrl(" http://www.google.com");
          本地文件用:webView.loadUrl(" file:///android_asset/XX.html");  本地文件存放在:assets文件中
    五、若是但愿点击连接由本身处理,而不是新开Android的系统browser中响应该连接。
          给WebView添加一个事件监听对象(WebViewClient)     
       
          并重写其中的一些方法
                shouldOverrideUrlLoading:对网页中超连接按钮的响应。
                                          当按下某个链接时WebViewClient会调用这个方法,并传递参数:按下的url
                onLoadResource  
                onPageStart 
                onPageFinish 
                onReceiveError
                onReceivedHttpAuthRequest
         
    六、若是用webview点连接看了不少页之后,若是不作任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,若是但愿浏览的网页回退而不是退出浏览器,须要在当前Activity中处理并消费掉该Back事件。        覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。   public boolean onKeyDown(int keyCoder,KeyEvent event){                         if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){                                 webview.goBack();   //goBack()表示返回webView的上一页面                                 return true;                         }                         return false;                 }
相关文章
相关标签/搜索