在Android的webview中定制js的alert,confirm和prompt对话框的方法

http://618119.com/archives/2010/12/20/199.html

1.首先继承android.webkit.WebChromeClient实现MyWebChromeClient。

2.在MyWebChromeClient.java中覆盖onJsAlert,onJsConfirm,onJsPrompt三个方法。

3.在初始化Webview时设置调用webview.setWebChromeClient(new MyWebChromeClient());

4.在Webview载入的html中使用window.alert,window.confirm,window.prompt方法,系统弹出的将是自定义实现的对应对话框。

MyWebChromeClient.java的代码如下:

  1. import android.app.AlertDialog;
  2. import android.content.DialogInterface;
  3. import android.content.DialogInterface.OnCancelListener;
  4. import android.content.DialogInterface.OnClickListener;
  5. import android.content.DialogInterface.OnKeyListener;
  6. import android.graphics.Bitmap;
  7. import android.os.Message;
  8. import android.util.Log;
  9. import android.view.KeyEvent;
  10. import android.webkit.JsPromptResult;
  11. import android.webkit.JsResult;
  12. import android.webkit.WebChromeClient;
  13. import android.webkit.WebView;
  14. import android.widget.EditText;
  15. /**
  16. * http://618119.com/archives/2010/12/20/199.html
  17. */
  18. //****************************************************************************
  19. public class MyWebChromeClient extends WebChromeClient {
  20. @Override
  21. public void onCloseWindow(WebView window) {
  22. super.onCloseWindow(window);
  23. }
  24. @Override
  25. public boolean onCreateWindow(WebView view, boolean dialog,
  26. boolean userGesture, Message resultMsg) {
  27. return super.onCreateWindow(view, dialog, userGesture, resultMsg);
  28. }
  29. /**
  30. * 覆盖默认的window.alert展示界面,避免title里显示为“:来自file:////”
  31. */
  32. public boolean onJsAlert(WebView view, String url, String message,
  33. JsResult result) {
  34. final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
  35. builder.setTitle("对话框")
  36. .setMessage(message)
  37. .setPositiveButton("确定", null);
  38. // 不需要绑定按键事件
  39. // 屏蔽keycode等于84之类的按键
  40. builder.setOnKeyListener(new OnKeyListener() {
  41. public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {
  42. Log.v("onJsAlert", "keyCode==" + keyCode + "event="+ event);
  43. return true;
  44. }
  45. });
  46. // 禁止响应按back键的事件
  47. builder.setCancelable(false);
  48. AlertDialog dialog = builder.create();
  49. dialog.show();
  50. result.confirm();// 因为没有绑定事件,需要强行confirm,否则页面会变黑显示不了内容。
  51. return true;
  52. // return super.onJsAlert(view, url, message, result);
  53. }
  54. public boolean onJsBeforeUnload(WebView view, String url,
  55. String message, JsResult result) {
  56. return super.onJsBeforeUnload(view, url, message, result);
  57. }
  58. /**
  59. * 覆盖默认的window.confirm展示界面,避免title里显示为“:来自file:////”
  60. */
  61. public boolean onJsConfirm(WebView view, String url, String message,
  62. final JsResult result) {
  63. final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
  64. builder.setTitle("对话框")
  65. .setMessage(message)
  66. .setPositiveButton("确定",new OnClickListener() {
  67. public void onClick(DialogInterface dialog,int which) {
  68. result.confirm();
  69. }
  70. })
  71. .setNeutralButton("取消", new OnClickListener() {
  72. public void onClick(DialogInterface dialog, int which) {
  73. result.cancel();
  74. }
  75. });
  76. builder.setOnCancelListener(new OnCancelListener() {
  77. @Override
  78. public void onCancel(DialogInterface dialog) {
  79. result.cancel();
  80. }
  81. });
  82. // 屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题
  83. builder.setOnKeyListener(new OnKeyListener() {
  84. @Override
  85. public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {
  86. Log.v("onJsConfirm", "keyCode==" + keyCode + "event="+ event);
  87. return true;
  88. }
  89. });
  90. // 禁止响应按back键的事件
  91. // builder.setCancelable(false);
  92. AlertDialog dialog = builder.create();
  93. dialog.show();
  94. return true;
  95. // return super.onJsConfirm(view, url, message, result);
  96. }
  97. /**
  98. * 覆盖默认的window.prompt展示界面,避免title里显示为“:来自file:////”
  99. * window.prompt('请输入您的域名地址', '618119.com');
  100. */
  101. public boolean onJsPrompt(WebView view, String url, String message,
  102. String defaultValue, final JsPromptResult result) {
  103. final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
  104. builder.setTitle("对话框").setMessage(message);
  105. final EditText et = new EditText(view.getContext());
  106. et.setSingleLine();
  107. et.setText(defaultValue);
  108. builder.setView(et)
  109. .setPositiveButton("确定", new OnClickListener() {
  110. public void onClick(DialogInterface dialog, int which) {
  111. result.confirm(et.getText().toString());
  112. }
  113. })
  114. .setNeutralButton("取消", new OnClickListener() {
  115. public void onClick(DialogInterface dialog, int which) {
  116. result.cancel();
  117. }
  118. });
  119. // 屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题
  120. builder.setOnKeyListener(new OnKeyListener() {
  121. public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {
  122. Log.v("onJsPrompt", "keyCode==" + keyCode + "event="+ event);
  123. return true;
  124. }
  125. });
  126. // 禁止响应按back键的事件
  127. // builder.setCancelable(false);
  128. AlertDialog dialog = builder.create();
  129. dialog.show();
  130. return true;
  131. // return super.onJsPrompt(view, url, message, defaultValue,
  132. // result);
  133. }
  134. @Override
  135. public void onProgressChanged(WebView view, int newProgress) {
  136. super.onProgressChanged(view, newProgress);
  137. }
  138. @Override
  139. public void onReceivedIcon(WebView view, Bitmap icon) {
  140. super.onReceivedIcon(view, icon);
  141. }
  142. @Override
  143. public void onReceivedTitle(WebView view, String title) {
  144. super.onReceivedTitle(view, title);
  145. }
  146. @Override
  147. public void onRequestFocus(WebView view) {
  148. super.onRequestFocus(view);
  149. }
  150. }
 

在Android的webview中定做js的alert,confirm和prompt对话框的方法的更多相关文章

  1. (转)在Android的webview中定制js的alert,confirm和prompt对话框的方法

    1.首先继承android.webkit.WebChromeClient实现MyWebChromeClient. 2.在MyWebChromeClient.java中覆盖onJsAlert,onJsC ...

  2. 在WebView中加载HTML页面时显示进度对话框的方法

    webView.setWebViewClient(new WebViewClient(){            ProgressDialog prDialog;            @Overri ...

  3. 在webView 中使用JS 调用 Android / IOS的函数 Function

    最近做一个项目,混合了NativeCode 和 HTML,为了便于JS 调用App的一些方法,统一封装一个Js方法,记录如下 Android 端首先要再WebView中允许JS的调用 WebView ...

  4. Android原生webview中js交互

    http://www.cnblogs.com/android-blogs/p/4891264.html Html页面和Java代码结合的方式一般用在界面经常被更改 的情况下,可以讲html放在网络中, ...

  5. Android 响应webview中图片的点击事件

    最近碰到个新需求需要点击webview中的图片进行放大显示. 整理了下思路,想到了下面的一个可行的方案. 方案思路, 1.在点击图片的时候调用本地的java方法并给出响应的图片地址 2.本地获得图片地 ...

  6. 【Android】java中调用JS的方法

    最近因为学校换了新的教务系统,想做一个模拟登陆功能,发现登陆的账号和密码有一个js脚本来进行加密 整理了一下java中执行JS的方法 智强教务 账号 密码 加密方法 var keyStr = &quo ...

  7. WebView中打开相机,文件选择器的问题和解决方法

    近几年前端开发真是越来越火,H5页面开发的移动端页面甚至有夺我原生开发半壁江山的意思,忧伤忧伤.不过从实际情况考虑,H5一套代码到处跑的特性,我们的Android, IOS ...也就只能呵呵了.然而 ...

  8. salesforce零基础学习(一百二十)快去迁移你的代码中的 Alert / Confirm 以及 Prompt吧

    本篇参考: https://developer.salesforce.com/blogs/2022/01/preparing-your-components-for-the-removal-of-al ...

  9. Android 在webView中创建web应用(译文)

    如果你想在客户端添加一个web应用程序或者仅仅一个web页面,你可以通过使用WebView,WebView是基于android中View的扩展,能够在Activity的layout中实现显示网页,它不 ...

随机推荐

  1. 魅蓝Note2 在Android Studio 与 Eclipse中无法被检测到

    昨天到手的Note2 结果发现测试不了,一看魅蓝的版本是android 5.1,然后更新的自己的SDK. 最后…… 仍然不能识别到手机. ———————————— 今天在stackoverflow上搜 ...

  2. 8个免费实用的C++GUI库(转载)

      C++标准中并没有包含GUI,这也使得C++开发图形化界面需要依赖于第三方的库.实际上,图形界面恰恰是C++的强项,小到平常使用的各类桌面软件,大到魔兽世界这样的游戏,都是C++擅长的地方.C++ ...

  3. SEO入门教程

    什么是SEO? SEO的中文名叫做搜索引擎优化,主要的作用是将网站的关键词优化到搜索引擎靠前的位置 其中关键词可以划分成以下这几类: 主关键词,长尾关键词,相关关键词 例如:主关键词:网页 长尾关键词 ...

  4. jquery源码分析

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 前段时间上班无聊之时,研究了 ...

  5. 事务四大特征:原子性,一致性,隔离性和持久性(ACID)

    一.事务 定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位. 准备工作:为了说明事务的ACID原理,我们使用银行账户及资金管理的案例进行分析. [sql] ...

  6. Spring-事物传播行为

    spring事物的传播属性(7种) REQUIRED(默认) 业务方法需要在一个容器里运行.如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务. 存在事物,则使用当前事物 ...

  7. FooTable高级的响应式表格jQuery插件

    FooTable是一个高级jQuery插件,允许开发者在触屏智能手机及平板电脑等小型设备上制作数据非常惊人的HTML表格.它可以将HTML表转换成可扩展的响应式表格,且通过单击某一行即可将该行数据隐藏 ...

  8. opencv笔记4:模板运算和常见滤波操作

    time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工 ...

  9. view的绘制原理

    转:http://blog.csdn.net/berber78/article/details/42069301 自定义UI控件,需继承 View类或View的子类,并重载View类中的一些方法,不必 ...

  10. WWDC2014总结---For产品经理们

    一年一度的苹果开发者大会WWDC2014,在北京时间6月3日凌晨1点开始了,苹果发布了iOS8.OSX10.10等,苹果比以前更加开放了,网上东西很多很杂,但缺少从产品开发角度来梳理的文章. 我根据这 ...