android WebView 与javaScript交互

首先,和普通的控件一样,我们只需要在xml声明

<?xml version="1.0" encoding="utf-8"?>
<WebView  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>

然后通过findViewById就可以获取到一个WebView实例

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.baidu.com");

当然,不要忘了权限

<manifest ... >
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

接着,如果想让web页面可以调用本地方法,诸如用javaScript等访问本地sqlite等:

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);

然后来个一个类作为接口

public class WebAppInterface {
    Context mContext;

    WebAppInterface(Context c) {
        mContext = c;
    }

    @JavascriptInterface
    public void showToast(String toast) {
        Toast.makeText(mContext, toast,Toast.LENGTH_SHORT).show();
    }
}

然后设置

webView.addJavascriptInterface(new WebAppInterface(this), "Android");

这样就js中就会收到一个WebAppInterface实例,接下来就可以在js中调用代码该接口的方法了

<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />

<script type="text/javascript">
    function showAndroidToast(toast) {
        Android.showToast(toast);
    }
</script>

那么如何调用js代码呢,可以直接

webView.loadUrl("javascript:fn()");

不过,推荐下面的方法

webView.evaluateJavascript("js method", new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String value) {

                }
            });

需要注意,这个方法运行和返回都是在UI线程,但是这个方法是异步的,不会马上回调接口。

但是到这里其实是有一个问题的,上面的代码在运行的时候是会调用系统浏览器然后加载页面。所以这里还要做一些处理。同时,web内部通常还会有其他链接,怎么处理页面之间的导航了,继续看看文档给的方案

private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (Uri.parse(url).getHost().equals("m.baidu.com")) {
            // This is my web site, so do not override; let my WebView load the page
            view.loadUrl(url);
            return false;
        }
        // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
        return true;
    }
}

这样就会让host是“m.baidu.com”的页面在webView中打开网页,其他的页面在浏览器中打开,当然,如果你不想打开浏览器,那就直接loadurl然后返回true。

重写返回键实现页面后退,很简单,webView会自动缓存浏览历史


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // 如果有历史页面,返回到上一页
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
        myWebView.goBack();
        return true;
    }
    // 如果没有历史记录,默认处理
    // system behavior (probably exit the activity)
    return super.onKeyDown(keyCode, event);
}

好了,暂时就这些,有错误还望指正,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值