Android 的WebView开发及应用

来源:互联网 发布:linux 配置https代理 编辑:程序博客网 时间:2024/05/24 16:16

 http://www.mars-droid.com/bbs/forum.php?mod=viewthread&tid=2810

为了收缩由于手机客户端的改变而构成的客户端重复更新,还是定夺批准WebView+版面的揭示措施来作为最后的计划。也与一些做手机利用开发的一些朋友咨询过,可能也是批准相仿的思路。

批准WebView的措施有个比拟关键的问题必需处理,即便版面与Andriod客户端举行交互,只有告终交互能力够更好的扼制手机客户端与web服务器间的通信,举行哀求,应答的加密、收缩等等。

还是老措施,在google上百度一下,一切即便那么容易。引用下面一段代码,看一下就打听了

看我们的html文档:

Html代码

<html>

<script language="javascript">

function wave() {

alert("1");

document.getElementByIdx_x("droid").src="android_waving.png";

alert("2");

}

</script>

<body>

<!-- Calls into the javascript inte***ce for the activity -->

<a onClick="window.demo.clickOnAndroid()"><div style="width:80px;

margin:0px auto;

padding:10px;

text-align:center;

border:2px solid #202020;" >

<img id="droid" src="android_normal.png"/><br>

Click me!

</div></a>

</body>

</html>

再看我们的java 代码。

Java代码

public class WebViewDemo extends Activity {

private static final String LOG_TAG = ”WebViewDemo”;

private WebView mWebView;

private Handler mHandler = new Handler();

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

mWebView = (WebView) findViewById(R.id.webview);

WebSettings webSettings = mWebView.getSettings();

webSettings.setSavePassword(false);

webSettings.setSaveFormData(false);

webSettings.setJavaScriptEnabled(true);

webSettings.setSupportZoom(false);

mWebView.setWebChromeClient(new MyWebChromeClient());

mWebView.addJavascriptInte***ce(new DemoJavaScriptInte***ce(), ”demo”);

mWebView.loadUrl(“file:///android_asset/demo.html”);

}

final class DemoJavaScriptInte***ce {

DemoJavaScriptInte***ce() {

}

public void clickOnAndroid() {

mHandler.post(new Runnable() {

public void run() {

mWebView.loadUrl(“javascript:wave()”);

}

});

}

}

final class MyWebChromeClient extends WebChromeClient {

@Override

public boolean onJsAlert(WebView view, String url, String message, JsResult result) {

Log.d(LOG_TAG, message);

result.confirm();

return true;

}

}

}

精细分析一下,中心就下面两句代码:

在java中利用WebViewwww.szyef.info的addJavascriptInte***ce措施,发生java实例与javascript对象之间的照射。如下:

mWebView.addJavascriptInte***ce(new DemoJavaScriptInte***ce(), ”demo”);

然后再javascript中穿越window.demo直接举行java对象的拜会。

其实,当我们看到这些措施的时候,只能慨叹google的强悍!蜜丝佛陀

自:softhood.net/cn/2010/06/30/别样视角的存在也解释了为什么作者必需编辑,而行发动必需教练的起因。

SVM入门(三)线性分类器Part 2.

手机游戏动态论坛------高校讲座.

 

 

MVC模式(Model-View-Controller)

1.WebView的设置

 
  1. 1 private void showViews() { 2 // TODO Auto-generated method stub 3 mGestureDetector = new GestureDetector(this);//实例化手势对象 4 wv_vm.getSettings().setSupportZoom(true);//启用页面的缩放 5 wv_vm.getSettings().setBuiltInZoomControls(true);//启用页面缩放的按钮 6 wv_vm.getSettings().setJavaScriptEnabled(true);//启用javascript支持 7 wv_vm.loadUrl("http://www.cnblogs.com/pxue/");//加载网址 8 9 wv_vm.setOnTouchListener(this);//监听触摸事件10 wv_vm.setClickable(true);11 wv_vm.setLongClickable(true);12 13 14 mGestureDetector.setIsLongpressEnabled(true); 15 16 17 wv_vm.setWebViewClient(new HelloWebViewClient());//实现点击加载页面在本webview内载入18 wv_vm.setFocusable(true);19 wv_vm.requestFocus();20 21 }

在WebView加载新开的页面,是重写了android.webkit.WebViewClient
 

  1. 1 private class HelloWebViewClient extends WebViewClient {2 @Override3 public boolean shouldOverrideUrlLoading(WebView view, String url) {4 view.loadUrl(url);5 return true;6 }7 }

2.划屏手势部分
监听触摸时间传给手势对象
 

  1. 1 @Override2 public boolean onTouch(View v, MotionEvent event) {3 // TODO Auto-generated method stub4 // Toast.makeText(this, "onTouch", Toast.LENGTH_SHORT).show(); 5 return mGestureDetector.onTouchEvent(event); 6 }

重写了划动事件
 

  1. 1 @Override 2 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 3 float velocityY) { 4 // TODO Auto-generated method stub 5 if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 6 && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 7 wv_vm.goBack(); 8 } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 9 && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {10 11 wv_vm.goForward();12 }13 return false;14 }

变量、常量的声明
 

  1. 1 private GestureDetector mGestureDetector;2 3 private static final int SWIPE_MIN_DISTANCE = 120;4 private static final int SWIPE_THRESHOLD_VELOCITY = 200;


3.调用系统拍照功能部分
 

  1. 1 private void setListensers() { 2 // TODO Auto-generated method stub 3 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 4 startActivityForResult(intent, 1); 5 6 } 7 8 private void findViews() { 9 // TODO Auto-generated method stub10 img_pic=(ImageView)findViewById(R.id.img_pic);11 12 }13 14 protected void onActivityResult(int requestCode, int resultCode, Intent data)15 {16 if (requestCode == 1)17 {18 if (resultCode == Activity.RESULT_OK)19 {20 // 拍照Activity保存图像数据的key是data,返回的数据类型是Bitmap对象21 Bitmap cameraBitmap = (Bitmap) data.getExtras().get("data");22 // 在ImageView组件中显示拍摄的照片23 img_pic.setImageBitmap(cameraBitmap);24 }25 }26 super.onActivityResult(requestCode, resultCode, data);27 }
我是用URL过滤器来过滤掉一些webview不接受的url,但是这些url我仍然想处理,所以打算用个ACTION_VIEW intent来实现,我的想法是先检查url,如果它是以 "http" "https" "ftp" "mailto"开头的,那就直接用webview,如果不是就启动个新的intent,我的想法对吗?或者有什么更好的想法?除了以上几个,webview还能处理什么协议的?
  1. webView.setWebViewClient(new WebViewClient() {
  2. @Override
  3. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  4. if (url != null && url.contains("://") && url.toLowerCase().startsWith("market:")) {
  5. try {
  6. view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
  7. return true;
  8. } catch (Exception ex) {
  9. }
  10. }
  11. view.loadUrl(url);
  12. return true;
  13. }
  14. });
  15. 复制代码
复制代码