------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
WebKit是一个开源的浏览器网页排版引擎,包含WebCore排版引擎和JSCore引擎。WebCore和JSCore引擎来自于KDE项目的KHTML和KJS开源项目。
Android平台的Web引擎框架采用了WebKit项目中的WebCore和JSCore部分,上层由Java语言封装,并且作为API提供给Android应用开发者,而底层使用WebKit核心库(WebCore和JSCore)进行网页排版。
关于WebKit这里有很好的介绍,阅读后还是能感受到webview的强大的,我这里只是简单的使用,实在无法显现其强大之处。
webview + html5,只要结合使用的恰当,真的是能给用户带来别样的体验的。 废话不说 这里就记录下自己的使用方法吧。
为了方便使用维护,个人觉得还是有必要自定义下webview的,如下:
public class SelfWebView extends WebView
{
private Activity mActivity;
public SelfWebView(Context context)
{
super(context);
this.mActivity = (Activity) context;
}
public SelfWebView(Context context, AttributeSet attrs)
{
super(context, attrs);
this.mActivity = (Activity) context;
}
@SuppressWarnings("deprecation")
@SuppressLint("SetJavaScriptEnabled")
public void initView()
{
DisplayMetrics displaysMetrics = new DisplayMetrics();
mActivity.getWindowManager().getDefaultDisplay().getMetrics(displaysMetrics);
int pixWidth= displaysMetrics.widthPixels;
int height= displaysMetrics.heightPixels;
System.out.println("---------------------------------------"+pixWidth +" "+height);
this.getSettings().setLoadsImagesAutomatically(true);
this.getSettings().setBuiltInZoomControls(false);
this.getSettings().setJavaScriptEnabled(true);
this.getSettings().setDefaultTextEncodingName("utf-8");
this.getSettings().setUseWideViewPort(true);
this.getSettings().setSavePassword(false);
this.getSettings().setSaveFormData(true);
this.getSettings().setAllowFileAccess(true);
this.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
this.requestFocus();
this.setWebViewClient(new WebViewClient(){
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url)
{
CookieSyncManager.createInstance(view.getContext());
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(url, cookieManager.getCookie(url));
CookieSyncManager.getInstance().sync();
}
});
}
}
首先要实现构造方法,这是自定义控件时必须做的事,关于几个构造方法根据参数的不同分别是在不用使用场景下提供调用的:
public View (Context context) 在java代码创建视图的时候被调用,如果是从xml填充的视图,就不会调用这个
public View (Context context, AttributeSet attrs) 在xml创建但是没有指定style的时候被调用
public View (Context context, AttributeSet attrs, int defStyle)在xml创建并且有style的时候被调用
DisplayMetrics displaysMetrics = new DisplayMetrics();
mActivity.getWindowManager().getDefaultDisplay().getMetrics(displaysMetrics);
int pixWidth= displaysMetrics.widthPixels;
int height= displaysMetrics.heightPixels;
System.out.println("---------------------------------------"+pixWidth +" "+height);
这里是想让定义的webView以自适应屏幕的,后面会补上后面的代码。
this.getSettings().setLoadsImagesAutomatically(true);//支持自动加载图片
this.getSettings().setBuiltInZoomControls(false);//禁止放缩
this.getSettings().setJavaScriptEnabled(true);//支持javascript
this.getSettings().setDefaultTextEncodingName("utf-8");//设置默认编码
this.getSettings().setUseWideViewPort(true);
this.getSettings().setSavePassword(false);//保存表单登陆密码 推荐不适用 现已经过时
this.getSettings().setSaveFormData(true); //保存表单数据
this.getSettings().setAllowFileAccess(true); //设置可访问文件
this.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开心的页面 这个很重要,起初再这里费了不少劲
this.requestFocus();
默认的webview打开新页面的方式是使用系统默认的浏览器打开的,这样的话我们的工作就算是白做了,所以要禁掉,保证页面始终再自己的定义的webView中打开
其实很简单只要重shouldOverrideUrlLoading即可。
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
由于需求,我这里的webview 要保存用户登录时的账户密码,由于setSavePassword会有个提示页,没试用这种方式,web服务端提供了 Cookie保存密码的方式,
这里就用了Cookie报存密码做了自动登录。
public void onPageFinished(WebView view, String url)
{
CookieSyncManager.createInstance(view.getContext());
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(url, cookieManager.getCookie(url));
CookieSyncManager.getInstance().sync();
}
});
这里还有一点要注意的,android的webview默认不支持通过<input type = file>选择文件,需要自己去实现,实现的方式也不难找,网上普遍使用的方法
通过WebChromeClient设置input选择文件 ,这里又实现了自己的WebChromeClient
public class SelfWebChromeClient extends WebChromeClient
{
private Activity mActivity;
@SuppressWarnings("unused")
private ValueCallback<Uri> mUploadMessage;
public SelfWebChromeClient(Activity act, ValueCallback<Uri> mUploadMessage)
{
this.mActivity = act;
this.mUploadMessage = mUploadMessage;
}
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg)
{
mUploadMessage = uploadMsg;
mActivity.setmUploadMessage(uploadMsg);//这里是根据有自己的需要
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
mActivity.startActivityForResult(Intent.createChooser(i, "File Chooser"),Constant.FILECHOOSER_RESULTCODE);
}
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType ) {
mUploadMessage = uploadMsg;
mActivity.setmUploadMessage(uploadMsg);
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
mActivity.startActivityForResult(Intent.createChooser(i, "File Browser"),Constant.FILECHOOSER_RESULTCODE);
}
//For Android 4.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){
mUploadMessage = uploadMsg;
mActivity.setmUploadMessage(uploadMsg);
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
mActivity.startActivityForResult( Intent.createChooser( i, "File Chooser" ), Constant.FILECHOOSER_RESULTCODE);
}
}
使用:
webView.setWebChromeClient(new SelfWebChromeClient(this,mUploadMessage){
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if(newProgress == 100) {
webView.setVisibility(View.VISIBLE);
loadLayout.setVisibility(View.GONE);
}
}
});
除此在对应的Activity中再复写onActivityResult即可,
protected void onActivityResult(int requestCode, int resultCode,Intent intent) {
if(requestCode==Constant.FILECHOOSER_RESULTCODE)
{
if (null == mUploadMessage) return;
Uri result = intent == null || resultCode!= RESULT_OK ? null:intent.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
除去以上之外,webview还有很多使用的方法,我在使用时最多的就是webView.getUrl()通过判断当先地址对某些特殊的页面进行特殊处理。
有套完整的h5页面做个基于webview的app其实就基本上就是这么简单。