`

在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的代码如下: 

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

相关推荐

    android webView.pptx

    为了能够处理来自JavaScript的alert、confirm和prompt对话框,我们需要创建一个自定义的WebChromeClient: ```java class MyWebChromeClient extends WebChromeClient { // 覆盖方法 @Override public boolean...

    android中webview加载本地页面,并处理js事件

    - 使用`WebChromeClient`的`onJsAlert()`、`onJsConfirm()`和`onJsPrompt()`方法处理JavaScript的alert、confirm和prompt对话框。 - `WebView`还提供了`onJsBeforeLoad()`、`onJsTimeout()`等回调,可以监听...

    ANDROIDWEBVIEW中的JAVASCRIPT代码使用[参照].pdf

    为了正确处理JavaScript的`alert()`、`confirm()`和`prompt()`对话框,以及获取加载进度等信息,你需要为你的WebView设置一个`WebChromeClient`实例。例如: ```java myWebView.setWebChromeClient(new ...

    Android中WebView的JS交互的几种方式

    本篇将详细讲解在Android中使用WebView进行JS交互的几种常见方法,以及如何在实际项目中应用这些技术。 1. **注入JavaScript接口(JavaScript Interface)** Android提供了`addJavascriptInterface()`方法,允许...

    安卓浏览器WebViewJSHTML5相关-androidwebview加载本地html.zip

    `WebChromeClient`通常用于处理JavaScript的对话框(如alert、confirm、prompt)、进度信息以及文件选择器。而`WebViewClient`则用于拦截页面的加载事件,比如在页面加载开始、完成或出错时进行相应的处理。通过重写...

    android4.4 WebView与js交互

    3. **`WebViewChromeClient`**:在更复杂的情况下,可以使用`WebChromeClient`来处理JavaScript的异步调用,如`window.confirm()`、`window.prompt()`和`window.alert()`。通过重写`onJsPrompt()`、`onJsAlert()`和`...

    Android 和 javascript 交互 Android混合开发之WebView与Javascript交互

    你可以重写`onJsAlert`、`onJsConfirm`和`onJsPrompt`来处理JavaScript的alert、confirm和prompt对话框。 2. `WebViewClient`:主要负责页面加载过程中的事件,如页面开始加载、页面加载完成、错误处理等。重写`...

    AndroidWebView.rar

    - `WebChromeClient`:处理更复杂的交互,如弹出对话框、处理JavaScript的alert、confirm、prompt等。 3. **Android与WebView的交互**: - **Android调用JavaScript**:使用`WebView.loadUrl("javascript:your...

    android webview视频全屏等功能demo

    - WebChromeClient则处理更复杂的交互,比如提供对话框、加载进度、JavaScript的alert、confirm、prompt等。 3. **处理视频播放**: - 默认情况下,WebView可能不会自动全屏播放视频。我们需要重写...

    android和js交互demo

    2. **WebChromeClient**: 提供了与JavaScript交互的一些高级功能,如`onJsAlert()`、`onJsConfirm()`、`onJsPrompt()`用于处理JavaScript的alert、confirm和prompt对话框,以及`onProgressChanged()`跟踪网页加载...

    android捕获js中的dialog事件

    `android捕获js中的dialog事件`这个主题涉及到如何在Android的WebView组件中监听并处理JavaScript弹出的对话框,如alert、confirm和prompt。这篇博文链接指向的是ITEYE上的一篇博客,虽然具体内容无法在此提供,但...

    android中java和js互调

    总结,Java和JavaScript在Android中的互调涉及多个层面,包括`WebView`的使用、接口定义、客户端配置以及安全性控制。理解和熟练掌握这些知识点对于开发混合式应用至关重要。通过合理的使用,可以充分利用两者的优势...

    android WebViewClient与WebChromeClient用法

    在Android应用开发中,WebView是一个重要的组件,它允许开发者在应用程序内部展示网页内容。而当涉及到与网页交互时,我们通常会用到WebViewClient和WebChromeClient这两个关键类。它们各自有不同的职责,协同工作以...

    Android中java与js互调例子

    可以用来处理JavaScript的`prompt()`对话框,以及`WebChromeClient`的`onJsAlert()`和`onJsConfirm()`方法处理JavaScript的`alert()`和`confirm()`对话框。 最后,我们还可以通过`WebViewClient`的`...

    android与js交互实例

    例如,`WebChromeClient.onJsAlert()`、`onJsConfirm()`和`onJsPrompt()`可以捕获并处理JavaScript的alert、confirm和prompt对话框。 2. **postMessage和MessageChannel**:为了使JS能够调用Android,我们需要监听...

    Android 和 js调用桥

    2. **WebChromeClient**:更专注于提供高级的交互功能,如显示加载进度条、处理JavaScript的alert()、confirm()、prompt()对话框等。此外,WebChromeClient还提供了evaluateJavascript()方法,可以直接执行...

    简版android浏览器

    可以通过实现onProgressChanged方法来显示加载进度条,或者通过onJsAlert、onJsConfirm和onJsPrompt来处理JavaScript的alert、confirm和prompt对话框。 4. **网络请求处理**: 虽然WebView可以处理大部分的网页加载...

    Android与js交互

    我们可以通过重写`onJsAlert`、`onJsConfirm`和`onJsPrompt`方法来响应JavaScript的alert、confirm和prompt对话框。 2. `WebViewClient`: 主要负责处理页面加载的相关事件,如加载开始、加载结束等。我们可以通过...

    Android html5 js css调用测试例子.rar

     继承WebChromeClient类,在这个类的3个方法中,分别使用Android的内置控件重写了Js中对应的对话框,就是说对js中的对话框做处理了,就是重写了。  通过Android调用JS处理alert弹出框 、处理confirm弹出框、处理...

Global site tag (gtag.js) - Google Analytics