android WebView 和 Html 的相互调用

来源:互联网 发布:c语言abs 编辑:程序博客网 时间:2024/06/09 21:49

控件初始化:

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

                        }
                    });
                }


0 0
原创粉丝点击