最近几年随着h5的强势崛起,越来越多的公司运用h5开发或者采用h5与android的混合开发,前端时间公司就碰到了一个h5就和android交互的项目,本人也是在摸索中一次次改进,废话不说了直接上代码:
1.建议使用new Webview构建webview对象而不是直接在布局xml文件中运用
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="vertical" android:fitsSystemWindows="true" android:background="@color/loginbg" android:layout_height="match_parent"> <LinearLayout android:id="@+id/ll_web" android:orientation="vertical" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="0dp"> </LinearLayout> </LinearLayout>
2.new出webview对象,并通过websetting 类设置
webView = new WebView(MainActivity.this); webView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); ll_web.addView(webView); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true);
3.webview加载h5
webView.loadUrl(surl);
4.将java方法暴露给h5代码,当webview界面上触发某个事件后调取java方法(我这里是因为h5触发java两个不同的方法所以下面暴露两个java方法给h5
webView.addJavascriptInterface(new Lateralinterface(MainActivity.this), "wst"); webView.addJavascriptInterface(new LoginSucinterface(MainActivity.this), "log");以下是我定义的其中一个给h5调取的方法写法public class Lateralinterface { private Context context; private UpdateUi updateui; private Loginout loginout; public Lateralinterface(Context context) { this.context = context; updateui= (UpdateUi) context; loginout= (Loginout) context; } /** * 侧滑 * @param type */ @JavascriptInterface public void showToast(String type){ if(!TextUtils.isEmpty(type)){ updateui.showOrhide(type); } } public interface UpdateUi{ void showOrhide(String type); } /** * 退出 */ @JavascriptInterface public void loginOut(){ loginout.loginoutact(); } public interface Loginout{ void loginoutact(); } }
5.java代码调取h5的方法并传递值给h5(一定要等到h5界面加载完成后才能调取h5的方法,否者调取不成功,所以就要用到webview的
WebViewClient()回掉方法里面去调取
webView.setWebViewClient(new WebViewClient() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { // return super.shouldOverrideUrlLoading(view, request.getUrl().toString()); view.loadUrl(request.getUrl().toString()); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); progressBar.setProgress(0); progressBar.setVisibility(View.VISIBLE); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // progressBar.setVisibility(View.GONE); boolean b=SpUtils.getLoginsuc(MainActivity.this); if(!b) { //false 表示h5没登陆成功,没登录成功调取h5的方法,登陆成功就不调取 webView.loadUrl("javascript:getUserInfo('" + SpUtils.getpwd(MainActivity.this).get("user") + "','" + SpUtils.getpwd(MainActivity.