控件初始化:
WebView myWebView=(WebView).findViewById(R.id.wv);
获取焦点:
myWebView.requestFocus();
允许调试:
myWebview.setWebContentsDebuggingEnabled(true);
添加设置:
WebSettings settings=myWebview.getSettings();
允许执行脚本:
settings.setJavaScriptEnabled(true);
设置解码格式:
settings.setDefaultTextEncodingName("utf-8");
添加接口实例对象--可以添加多个
myWebview.addJavascriptInterface(getHtmlObject(), "MyTest");
注:
参数1:本地实例对象,传递给js调用本地方法使用的
参数2:页面调用的方法时使用的变量名
在对WebView包括WebSetting的设置的外层方法上添加:
@SuppressLint("JavascriptInterface")
表示在调用js的地方要通过Lint告知编译器,此处要访问Js方法
注:
在其他代码中有时会看到@SuppressLint("NewApi")
表示此处方法中会使用比我们在AndroidManifest中设置的Android:minSdkVersion版本更高的方法
使用后滤过报出因api版本不够而产生的警告。
浏览器设置:
mWebView.setWebChromeClient(new WebViewChromeClient(){...});
mWebView.setWebViewClient(new WebClient(){...});
注:
一般情况下两个方法设置一个就可以了,根据情况不同进行不同的选择:
1.当仅加载显示一般的html网页时,可以调用复写setWebChromeClient方法就足够了。
2.当进行兼容互联网上附加JavaScript的页面的时候和调用javascript对话框的时候,或者功能较为复杂的内嵌操作的时候,建议使用WebChromeClient
复写需要的方法:
myWebView.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
BaseActivity.this.setTitle("Loading...");
BaseActivity.this.setProgress(newProgress);
if(newProgress >= 80) {
BaseActivity.this.setTitle("Test");
}
}
});
回退监听:
myWebView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK && myWebView.canGoBack()) {
myWebView.goBack();
return true;
}
return false;
}
});
最后/加载网络网页
myWebView.loadUrl(url);
设置的部分告一段落,接下来时定义传递给页面中实例可以调用的方法:
就本例而言,传递回去的实例是getHtmlObject();
贴下代码:
private Object getHtmlObject(){
Object insertObj = new Object(){
//html调用本地方法
public String HtmlcallJava(){
return "Html call Java";
}
//html调用本地方法,传入参数
public String HtmlcallJava2(final String param){
return "Html call Java : " + param;
}
//java调用html的function
public void JavacallHtml(){
runOnUiThread(new Runnable() {
@Override
public void run() {
//java调用html的function,修改id_input的值
mWebView.loadUrl("javascript: showFromHtml()");
//toast显示html调用过java代码
Toast.makeText(JSAndroidActivity.this, "clickBtn", Toast.LENGTH_SHORT).show();
}
});
}
//java调用html的function,传入参数
public void JavacallHtml2(){
runOnUiThread(new Runnable() {
@Override
public void run() {
//java调用html的function,并传入参数
mWebView.loadUrl("javascript: showFromHtml2('夜夜夜夜夜')");
Toast.makeText(JSAndroidActivity.this, "clickBtn2", Toast.LENGTH_SHORT).show();
}
});
}
};
//返回一个可以调用所有方法的实例
return insertObj;
}每个接口方法之前都要添加:@JavascriptInterface 标识这是js的接口方法
至此整个代码就完结了,最后贴上一段网页调用本地图库和相机的代码,希望能用的着。
@JavascriptInterface
public void javaFunction(final String type) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//1 相机 2 图库
if(type.equals("1")){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 加载路径
Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory().getAbsolutePath().toString()+ "/camera/save.jpg"));
// 指定存储路径,这样就可以保存原图了
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, 3);
}else{
Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 4);
}
}
});
}