作为一个刚刚起步做混合的小白,对开源的混合框架全不知晓,对于各种html、js更是一片迷茫,我想说接下来的路注定坎坷。。。
好吧,先从熟悉的开始准备:
1、android使用webview实现混合开发,关于第一步准备一个webview的布局
<WebView android:id="@+id/approve_wv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/relativeLayout" android:layout_alignParentBottom="true"></WebView>
你完全可以设置一个webview的布局占据整个终端屏幕,当然要根据不同的需求来布局,比如,我只是在webview显示的框框上边添加了一个标题@+id/relativelayout
2、创建一个activity添加该布局文件
3、权限问题(webview嘛),一看那就是需要连接互联网的娃嘛。。。
<uses-permission android:name="android.permission.INTERNET" />4、关于真正的编码
package com.testdemo.sun.test001; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.webkit.JavascriptInterface; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); private WebView wv_test; private static final String URL = "http://10.1.41.36:8888/notice/mobilelist.jsp"; private Button btn_back; private Button btn_forward; private Button btn_zoomin; private Button btn_zoomout; private Button btn_title_back; private Button btn_publish; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); wv_test = (WebView) findViewById(R.id.test001_webView); initView(); WebSettings wbSettings = wv_test.getSettings(); wbSettings.setJavaScriptEnabled(true);//表示webview可以执行web端的js代码 //如果访问的页面中有Javascript,则webview必须设置支持Javascript //如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点 wv_test.requestFocusFromTouch(); wv_test.setWebViewClient(new MyWebViewClient());//主要来监听页面内的连接,调用手机浏览器直接访问 wv_test.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); //与JS界面的交互,demo替换原js的弹窗,可以在该方法中覆写 wv_test.setWebChromeClient(new <span style="font-family: Arial, Helvetica, sans-serif;">WebChromeClient()</span><span style="font-family: Arial, Helvetica, sans-serif;">);</span> //服务器与app数据交互 JsObjection js = new JsObjection();//获取服务器端提交的数据 //JsObjection字符串即为JsObjection对象的引用,交互访问的别名(实现js调用原生方法) wv_test.addJavascriptInterface(js, "JsObjection"); //wView.loadUrl("file:///android_asset/index.html"); // -----打开本包内asset目录下的index.html文件 //wView.loadUrl("content://com.android.htmlfileprovider/sdcard/index.html"); // -----打开本地sd卡内的index.html文件 //wView.loadUrl("http://wap.baidu.com"); // -----打开指定URL的html文件 //wv_test.loadUrl("file:///android_asset/html/27-1.html"); //syncCookie(this, URL, "2253D1DCA304AE7DB96ABE7664EABDDC"); wv_test.loadUrl(URL); } public class JsObjection { @JavascriptInterface public String getMessage(String name, String pwd) { return name + ":" + pwd; } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && wv_test.canGoBack()) { wv_test.goBack(); return true; } return super.onKeyDown(keyCode, event); } // 监听 所有点击的链接,如果拦截到我们需要的,就跳转到相对应的页面。 public class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { wv_test.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { view.getSettings().setJavaScriptEnabled(true); super.onPageFinished(view, url); } } }
补充webviewClient中还可以覆写的方法及个方法代表的意思::
1,接收到Http请求的事件
onReceivedHttpAuthReques
2,打开链接前的事件
public boolean shouldOverrideUrlLoading
这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。
3
public void onPageFinished(WebView view, String url){ }
同样道理,我们知道一个页面载入完成,于是我们可以关闭loading条,切换程序动作。
4
public void onPageStarted(WebView view, String url, Bitmap favicon) { }
这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。
需要整理的内容就是这些,接下来解决session保持,避免重复登录