在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. VS一般设置(字体,背景色)

    字体 打开工具=>环境=>字体和颜色,字体:Consolas,大小:13 背景色 缩进设置 工具=>文本编辑器=>纯文本=>制表符=>保留制表符

  2. SQL的主键和外键

    SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外 ...

  3. redmine邮件发送功能配置详解

    redmine的邮件发送功能还是很有用的.像项目有更新啦,任务分配啦,都能邮件发送的相关责任人.我自己在linux服务器上安装并启动了redmine后,邮件一直发送了不了.查了网上的资料,都是讲修改下 ...

  4. ansible 常用模块

    http://www.linuxidc.com/Linux/2015-02/113068.htm

  5. oracle 简述

    1.数据库有很多的管理工具,Sqlplus是最好的管理工具. 2.sql语句是学习中最难的部分,如何编写出高效的sql 语句是我们的目标 3.oracle的日常最终要的工作就是备份,永远是备份,有数据 ...

  6. 反射工具类——ReflectUtils

    测试方法:根据已知的方法名,来反射调用方法 package com.redmoon.forum.job; import java.util.ArrayList; import java.util.Li ...

  7. on the way to Peking University

    明天就要去北京参加北大夏令营了,希望这次能有所斩获! on the way to Peking University

  8. 洛谷P1656 炸铁路

    题目描述 因为某国被某红色政权残酷的高压暴力统治.美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵. 该国有n个城市,这些城市以铁路相连.任意两个城市都可以通过铁路直接或者间接到达. uim ...

  9. POJ 2559 Largest Rectangle in a Histogram

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18942   Accepted: 6083 Description A hi ...

  10. 数组添加:如何往数组的"null"位置插入数据呢?

    数组添加,当已经存在的一个数组时,如何往数组的"null"位置插入数据呢? 分析: 1.循环遍历数组元素,找出null的位置(下标) 2.设置一个变量,接收null位置下标值 3. ...