近期在项目中遇到关于WebView与javascript的交互不能下载apk问题,顺便复习相关的知识。
1 基本使用
在xml中直接添加控件
<WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent"></WebView>
在项目中直接new,在性能方面大多数人使用这个
WebView webview = new WebView(this);
对webview进行基本的设置,这样webview就可以加载javascript的页面了。
webView = (WebView) findViewById(R.id.webView); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); webView.setWebViewClient(new WebViewClient()); webView.loadUrl(https://www.baidu.com);
还需要加载权限
<uses-permission android:name="android.permission.INTERNET"/>
但是这样的加载方式在项目中是无法使用的,只不过是具备了浏览器的功能,但是要想向浏览器那样使用还需要就行一些必要的设置
重写onkeydown方法,使app具有返回的功能
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (webView.canGoBack()) { // 返回上一页面 webView.goBack(); return true; } else { // 退出程序 finish(); } } return super.onKeyDown(keyCode, event); }
这样就可以在项目中友好的使用webview了。
当然webview也可以加载本地的H5页面,不过需要把这些文件放在assets下面,只需要在loadUrl这里把地址写上。
webView.loadUrl(file:///android_asset/index.html);
这就是webview的基本使用了
附图:
2 与js的交互
webView.getSettings().setJavaScriptEnabled(true);这条语句是必须的
在设置全局变量,这样在js中就可以接收到这个全局的变量
webView.addJavascriptInterface(new HTMLObject(this), "HObject");
在HTMLObject类中写需要处理的方法,但是必须在类的上面设置
@JavascriptInterface
public void showToast(String msg) { Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); }
这样就可以在类中使用了
3遇到的问题(此为重的)
webView.setWebViewClient(new WebViewClient());
如果在项目中设置了WebViewClient,那么项目中的所有的js事件都将在这个类中进行处理,否则会遇到按钮事件没有响应。
由于项目中加载一个HTML网页,设置了这个方法,但是没有重写下载的方法,导致这个网页的按钮事件不能响应。
还有可以在项目中不设置这个方法,那么webview会自动的调用默认的浏览器进行按钮事件的处理。