在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件,用于浏览网页
混合编程:安卓程序没法跨平台,web(H5)性能,体验各方面跟不上,一个app中对性能要求比较高的部分会用原生代码来写,某些对性能要求没那么高的部分用h5来写。
加载本地图片
webView.loadUrl(“file:///sdcard/eee.jpg”);
加载图片资源
mwvTest.loadUrl(“file:///android_asset/bbb.jpg”);
加载含有视频播放功能的本地网页
mwvTest.loadUrl(“file:///sdcard/download/test.html”);
网页内容:
test
需要设置webchromeclient:
mwvTest.setWebChromeClient(newWebChromeClient());
切换到后台:
@Override
protected void onPause() {
super.onPause();
mwvTest.onPause();
}
webView.loadUrl(“https://www.baidu.com”);
加载网页方法只能在主线程中访问,它本身是异步执行的
webView.setWebViewClient(new WebViewClient());
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
mwvTest.getSettings().setBlockNetworkImage(true);
@Override
public boolean shouldOverrideUrlLoading(WebView view,String url) {
editText.setText(url);
if (url.contains("image.baidu.com")){
Toast.makeText(MainActivity.this,"image",Toast.LENGTH_SHORT).show();
}
return true;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view,String url) {
editText.setText(url);
if (url.contains("image.baidu.com")){
Toast.makeText(MainActivity.this,"image",Toast.LENGTH_SHORT).show();
}
return false;
}
开始加载和加载完成的回调
public void onPageStarted(WebView view,String url,Bitmap favicon)
public void onPageFinished(WebView view,String url)
按回退键,可以使webview返回上一页
重写onkeydown方法,判断是否按下了返回键
如果按下了返回键,webview可以返回则返回上一页,并且return true,如果不可以返回,则调用父类的默认处理
按下其他键,还是调用父类的默认处理
@Override
public boolean onKeyDown(intkeyCode,KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK){
if (webView.canGoBack()){
webView.goBack();
return true;
}
}
return super.onKeyDown(keyCode,event);
}
webView.setWebChromeClient(newWebChromeClient() {
@Override
public void onProgressChanged(WebView view, intnewProgress) {
}
});
public void onReceivedTitle(WebView view,String title)
在android中定义一个类,其中的方法提供给js调用,方法前面要加上注解,否则会因为安全限制无法调用,如果是UI操作,需要发给UI线程执行
class JsTest{
@JavascriptInterface
public StringsayHello() {
return "Hello from android";
}
@JavascriptInterface
public void showAndroidButton(){
runOnUiThread(newRunnable() {
@Override
public void run() {
btGo.setVisibility(View.VISIBLE);
}
});
}
}
在asserts目录中新建一个html文件,代码如下:
jsandroid_test
hello IT-homer
把安卓中JsTest的对象关联为js中window下面的对象jsObj:
webView.addJavascriptInterface(newJsTest(),“jsObj”);
安卓中java代码也可以调用js代码,在test中增加一个方法:
@JavascriptInterface
public void excuteHtmlFun(){
runOnUiThread(new Runnable() {
@Override
public void run() {
webView.loadUrl("javascript: showFromHtml('1514')");
}
});
}
调用本地html文件:
String strUrl = "file:///android_asset/test.html";
webView.loadUrl(strUrl);
editText.setText(strUrl);
在弹出js alert对话框时可以回调,并替换默认的对话框,setWebChromeClient中调用:
@Override
public boolean onJsAlert(WebView view,String url,String message,JsResult result) {
new AlertDialog.Builder(MainActivity.this).setTitle("测试").setMessage(message).
setPositiveButton("ok", newDialogInterface.OnClickListener() {
@Override
public voidonClick(DialogInterface dialog, intwhich) {
}
}).create().show();
result.confirm();
return true;
}