控件初始化:

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);
                             }

                         }
                     });
                 }