Android WebView的使用方法及与JS 相互调用

Android WebView的使用方法及与JS 相互调用

1、添加网络权限

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

2、WebSettings 对访问页面进行设置。

WebView mWebView = new WebView(this);

WebSettings webSettings = mWebView .getSettings();//支持获取手势焦点,输入用户名、密码或其他

mWebView.requestFocusFromTouch();

webSettings.setJavaScriptEnabled(true); //支持js

webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小 

webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。

webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。

webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件

webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局 

webSettings.supportMultipleWindows(); //多窗口 

webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存 

webSettings.setAllowFileAccess(true); //设置可以访问文件 

webSettings.setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点

webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口 

webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片

webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式

3、页面加载方式

//加载一个网页:

mWebView.loadUrl();

//加载apk包中的一个html页面

mWebView.loadUrl();

//加载手机本地的一个html页面的方法:

mWebView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");

4、WebView 的两个重要方法 WebViewClient 和 WebChromeClient

WebViewClient就是帮助WebView处理各种通知、请求事件的。

//打开网页时不调用系统浏览器, 而是在本WebView中显示:
mWebView.setWebViewClient(new WebViewClient(){   

 @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);
    return true;
  }
});
//将上面定义的webviewclinet设置给webview
mWebView.setWebViewClient(webViewClient);

下面介绍 WebView 的一些事件:

WebViewClient mWebViewClient = new WebViewClient()
{
  shouldOverrideUrlLoading(WebView view, String url);
  //在网页上的所有加载都经过这个方法,这个函数我们可以做很多操作。
  //比如获取url,查看url.contains(“add”),进行添加操作
  shouldOverrideKeyEvent(WebView view, KeyEvent event);
  //重写此方法才能够处理在浏览器中的按键事件。
  onPageStarted(WebView view, String url, Bitmap favicon) ;
  //这个事件就是开始载入页面调用的,我们可以设定一个loading的页面,告诉用户程序在等待网络响应。
  onPageFinished(WebView view, String url);
  //在页面加载结束时调用。同样道理,我们可以关闭loading 条,切换程序动作。
  onLoadResource(WebView view, String url) ;
  // 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。
  onReceivedError(WebView view, int errorCode, String description, String failingUrl);
  // (报告错误信息)
  doUpdateVisitedHistory(WebView view, String url, boolean isReload);
  //(更新历史记录)
  onFormResubmission(WebView view, Message dontResend, Message resend);
  //(应用程序重新请求网页数据)
  onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,String realm);
  //(获取返回信息授权请求)
  onReceivedSslError(WebView view, SslErrorHandler handler, SslError error);
  //重写此方法可以让webview处理https请求。
  onScaleChanged(WebView view, float oldScale, float newScale);
  // (WebView发生改变时调用)
  onUnhandledKeyEvent(WebView view, KeyEvent event);
  //(Key事件未被加载时调用)
}

WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等。

WebChromeClient mWebChromeClient = new WebChromeClient() {

  //获得网页的加载进度,显示在右上角的TextView控件中
  @Override
  public void onProgressChanged(WebView view, int newProgress) {
    if (newProgress < 100) {
      String progress = newProgress + "%";
    } else {
    }
  }
  //获取Web页中的title用来设置自己界面中的title
  //当加载出错的时候,比如无网络,这时onReceiveTitle中获取的标题为 找不到该网页,
  //因此建议当触发onReceiveError时,不要使用获取到的title
  @Override
  public void onReceivedTitle(WebView view, String title) {
    MainActivity.this.setTitle(title);
  }
  @Override
  public void onReceivedIcon(WebView view, Bitmap icon) {
    //
  }
  @Override
  public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
    //
    return true;
  }
  @Override
  public void onCloseWindow(WebView window) {
  }
  //处理alert弹出框,html 弹框的一种方式
  @Override
  public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
    //
    return true;
  }
  //处理confirm弹出框
  @Override
  public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult
      result) {
    //
    return true;
  }
  //处理prompt弹出框
  @Override
  public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
    //
    return true;
  }
};

//同样,将上面定义的WebChromeClient设置给WebView:
webView.setWebChromeClient(mWebChromeClient);

5、调用 JS 代码

WebSettings webSettings = mWebView .getSettings(); 

webSettings.setJavaScriptEnabled(true);//这里必须设置

mWebView.addJavascriptInterface(new InsertObj(), "jsObj");

以下方法是 Android 和 JS 的交互

public class InsertObj extends Object {
 private static Activity mActivity;
 private static WebView mWebView;

 public InsertObj(Activity activity, WebView webView) {
 mActivity = activity;
 mWebView = webView;
 }
 //给html提供的方法,js中可以通过:var str = window.jsObj.HtmlcallJava(); 获取到
 @JavascriptInterface
 public String HtmlcallJava() {
 return "Html call Java";
 }
 //给html提供的有参函数 : window.jsObj.HtmlcallJava2("IT-homer blog");
 @JavascriptInterface
 public String HtmlcallJava2(final String result) {
 return "Html call Java : " + result;
 }
 //Html给我们提供的函数
 @JavascriptInterface
 public static void JavacallHtml() {
 mActivity.runOnUiThread(new Runnable() {
  @Override
  public void run() {
  //这里是调用方法
  mWebView.loadUrl("javascript: showFromHtml()");
  Toast.makeText(mActivity, "clickBtn", Toast.LENGTH_SHORT).show();
  }
 });
 }
 //Html给我们提供的有参函数
 @JavascriptInterface
 public static void JavacallHtml2(final String param) {
 mActivity.runOnUiThread(new Runnable() {
  @Override
  public void run() {
  mWebView.loadUrl("javascript: showFromHtml2('"+param+"')");
  Toast.makeText(mActivity, "clickBtn2", Toast.LENGTH_SHORT).show();
  }
 });
 }
}
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>无标题 1</title>
<script type="text/javascript">

  function HtmlcallJava(){
      var str = window.jsObj.HtmlcallJava();
      alert(str);
    }

  function HtmlcallJava2(){
       var str = window.jsObj.HtmlcallJava2("HTML");
       alert(str);
    }

 function showFromHtml()
 {
  alert("我是js方法,我被Android后台调用");
 }

 function showFromHtml2(result)
 {
  alert("我是js方法,我被Android后台调用 "+result);
 }

  </script>
</head>
<body>
<button onclick="HtmlcallJava()">HtmlcallJava</button>
<button onclick="HtmlcallJava2()">HtmlcallJava2</button>
</body>
</html>

 6、WebView 返回键

public boolean onKeyDown(int keyCode, KeyEvent event) {
  if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {    

    mWebView.goBack();
    return true;
  }
  return super.onKeyDown(keyCode, event);
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持,如有疑问请留言或者到本站社区交流讨论,大家共同进步!

(0)

相关推荐

  • 详解Android WebView的input上传照片的兼容问题

    问题 前几天接到的一个需求,是关于第三方理财产品的H5上传照片问题. 对方说他们的新的需求,需要接入方配合上传资产照片的需求,测试之后发现我们这边的app端,IOS端上传没有问题,而Android端则点击没有任何反应. 对方H5调用的方式是通过<input type='file' accept='image/*'/>的方式调用,本来以为这个问题很简单,就是app端没有设置相机权限,造成的点击无反应情况,而实际上加了之后发现,并非简单的权限问题. 解决问题 因为Android的版本碎片问题,很多

  • Android WebView自定义长按选择实现收藏/分享选中文本功能

    效果图(1.3M) 一.前言 ** 戳这里可以去DEMO,来吧 ** 相信刚接触android不久的同志们,在面对产品提出的 : "自定义WebView页面中,长按文本的弹出选项.点击选择后,分享.转发.收藏选择文本" 这样的需求时,第一反应大部分是:这是系统行为,如果实现需要在web端实现. 但是web端实现的局限性太大,曾经也有过监听系统粘贴板,在用户点击复制的时候实现其他的逻辑,但是这样用户体验不好,所以自定义WebView中长按的弹出菜单,并在点击时返回选中文本的小控件闪亮登场

  • Android WebView 不支持 H5 input type="file" 解决方法

    最近因为赶项目进度,因此将本来要用原生控件实现的界面,自己做了H5并嵌入webview中.发现点击H5中 input type="file" 标签 不能打开android资源管理器. 通过网络搜索发现是因为 android webview 由于考虑安全原因屏蔽了 input type="file" 这个功能 . 经过不懈的努力,以及google 翻译的帮助 在 stackoverflow 中找到了解决的方法. 具体可以理解为 重写webview 的WebChrome

  • 详解Android WebView加载html片段

    这里我先简单描述一下需求:服务器返回的是html页面的一部分带有标签的内容. 解决的思路是:将服务器返回的内容片段拼凑成一个完整的页面. 下面直接上核心代码: 这里是WebView一些配置 WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setDomStorageEnabled(true); settings.setUseWideViewPort(true);

  • 详解Android Webview加载网页时发送HTTP头信息

    详解Android Webview加载网页时发送HTTP头信息 当你点击一个超链接进行跳转时,WebView会自动将当前地址作为Referer(引荐)发给服务器,因此很多服务器端程序通过是否包含referer来控制盗链,所以有些时候,直接输入一个网络地址,可能有问题,那么怎么解决盗链控制问题呢,其实在webview加载时加入一个referer就可以了,如何添加呢? 从Android 2.2 (也就是API 8)开始,WebView新增加了一个接口方法,就是为了便于我们加载网页时又想发送其他的HT

  • Android的WebView与H5前端JS代码交互的实例代码

    前段时间项目有深度和前端对接过,也是碰了一些坑,现在有时间就拿出来分享下 JS调用原生不外乎就两种,一种是传假的url,也就是url拦截的方式,类似于下面这种: //js代码 function sendCommand(param){ var url="js-call://"+param; document.location = url; } sendCommand("PlaySnake"); //Java代码 mWebView.setWebViewClient(ne

  • Android 解决WebView调用loadData()方法显示乱码的问题

    Android 解决WebView调用loadData()方法显示乱码的问题 第一步: mWebView.getSettings().setDefaultTextEncodingName("UTF-8"); 第二步: mWebView.loadData(data, "text/html; charset=UTF-8", null); WebView常用配置: private void initWebView() { mWebView.getSettings().se

  • Android WebView的使用方法及与JS 相互调用

    Android WebView的使用方法及与JS 相互调用 1.添加网络权限 <uses-permission android:name="android.permission.INTERNET" /> 2.WebSettings 对访问页面进行设置. WebView mWebView = new WebView(this); WebSettings webSettings = mWebView .getSettings();//支持获取手势焦点,输入用户名.密码或其他 m

  • Android WebView的使用方法总结

     Android WebView的使用方法 Android app打开H5页一般要实现如下需求: 1.打开指定url网页: 2.点击链接可以跳转到下一页,并更新标题: 3.按back键或左箭头可以返回上一页: 4.当webview显示的是第一级url时, 按返回键或左箭头关闭当前界面: 5.WebView如何传值给android, 例如使用H5登录成功后返回姓名.token等等字段. 6.支持JavaScript, 支持显示js对话框. 7.无网络时显示默认布局, 以提高用户体验. 8.避免We

  • 详解Android JS相互调用

    最近在研究Android.JS相互调用,之前没怎么接触过,只知道loadUrl()就可以加载一个网页了,研究过之后发现Android可以调JS,JS也可以调Android原生控件,很开心啊.下面小编就开始喽: 原理就是Java和JS调用,在Android中是通过WebView来实现的. 下面先说一下简单的Android和JS相互调用 首先通过loadurl()来加载网页 WebView开启JS脚本执行 Android端提供JS调用的交互接口 简单的看一下代码: mWebView=(MyWebVi

  • Android与JS相互调用的方法

    目录 Android调用js的方法实现是引入一个webview用webview打开一个页面调取的JS函数. 下面是JS同Android的通信,JS调用Android的函数方法. Android调用js的方法实现是引入一个webview用webview打开一个页面调取的JS函数. private void InitWebView() { mWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = mWebVi

  • Android Webview重定向问题解决方法

    项目中需要webview重定向,但是由于一个webveiw里面有许多加载操作,因此在调用webview.goback()方法时,往往达不到我们需要的操作效果. 1.解决方法 WebBackForwardList webBackForwardList=webview.copyBackForwardList()获取webview加载栈,然后更具加载栈做逻辑操作 2.webBackForwardList常用的方法 int size = webBackForwardList.getSize() webB

  • 关于Android WebView的loadData方法的注意事项分析

    loadData()中的html data中不能包含'#', '%', '\', '?'四中特殊字符,出现这种字符就会出现解析错误,显示找不到网页还有部分html代码.需要如何处理呢?我们需要用UrlEncoder编码为%23, %25, %27, %3f .可以使用以下两种代码,data为string类型的html代码1.webView.loadData(URLEncoder.encode(data, "utf-8"), "text/html",  "u

  • Android WebView交互传递json字符串并解析的方法

    前言 我们大家都知道WebView交互中可以传递基本数据类型的数据值,比如常用的int,String. 但是WebView也可以传递一种很重要很常用的数据格式-json数据. 传递json和传递String数据是一样的,关键就是HTML5端对json数据通过eval()函数进行解析 传递过程中android端调用的最重要的一个函数就是: addJavascriptInterface(new MyObject(this,"dd"),"my"); 这个函数有两个参数,第

  • Android webview和js互相调用实现方法

    Android-webview和js互相调用 Android 和 H5 都是移动开发应用的非常广泛.市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附属类,提示性的页面是得不偿失的.而H5具有开发速度快,更新不用依赖于App的更新,只需要服务端更新相应的页面即可,所以,App和H5页面相结合就显得尤为重要.而android和H5都不可能每次都是独立存在的,而是相互影响也相互的调用,获取信息等,例如,H5页面要获取App中的用户的基本信息,或者App端要操作H5

  • Android WebView使用方法详解 附js交互调用方法

    目前很多Android app都内置了可以显示web页面的界面,会发现这个界面一般都是由一个叫做WebView的组件渲染出来的,学习该组件可以为你的app开发提升扩展性. 先说下WebView的一些优点: --可以直接显示和渲染web页面,直接显示网页 --webview可以直接用html文件(网络上或本地assets中)作布局 --和JavaScript交互调用 一.基本使用 首先layout中即为一个基本的简单控件: <WebView android:id="@+id/webView1

  • Android  webview和js互相调用实现方法

    Android-webview和js互相调用 Android 和 H5 都是移动开发应用的非常广泛.市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附属类,提示性的页面是得不偿失的.而H5具有开发速度快,更新不用依赖于App的更新,只需要服务端更新相应的页面即可,所以,App和H5页面相结合就显得尤为重要.而android和H5都不可能每次都是独立存在的,而是相互影响也相互的调用,获取信息等,例如,H5页面要获取App中的用户的基本信息,或者App端要操作H5

随机推荐