如何设置WebView支持js的Alert,Confirm,Prompt函数的弹出提示框.

默认情况下,Android WebView是不支持js的Alert(),Confirm(),Prompt()函数的弹出提示框的.即使设置了setJavaScriptEnabled(true);也是没用的.那么,如何才能让WebView可以支持js的这3个函数呢.可以通过设置WebChromeClient对象来完成.WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等等.

这里主要重写WebChromeClient的3个方法:

onJsAlert  :警告框(WebView上alert无效,需要定制WebChromeClient处理弹出)

onJsPrompt : 提示框.

onJsConfirm : 确定框.

效果图分别为:

1.Alert


2.Prompt


3.Confirm


先来看看js的页面代码:

[html]  view plain  copy
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  2.         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">  
  4. <head>  
  5.     <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">  
  6.     <title>Document</title>  
  7.     <script type="text/javascript">  
  8.        function call(){  
  9.             var value = document.getElementById("input").value;  
  10.             alert(value);  
  11.        }  
  12.        //警告  
  13.        function onAlert(){  
  14.             alert("This is a alert sample from html");  
  15.        }  
  16.        //确定  
  17.        function onConfirm(){  
  18.           var b = confirm("are you sure to login?");  
  19.           alert("your choice is "+b);  
  20.        }  
  21.        //提示  
  22.        function onPrompt(){  
  23.            var b = prompt("please input your password","aaa");  
  24.            alert("your input is "+b);  
  25.        }  
  26.     </script>  
  27.   
  28. </head>  
  29. <body>  
  30.     <input type="text" id="input" value="default"/>  
  31.     <button onclick=call()>点我弹出Alert</button></br>  
  32.     <input type="button" value="alert" onclick="onAlert()"/></br>  
  33.     <input type="button" value="confirm" onclick="onConfirm()"/></br>  
  34.     <input type="button" value="prompt" onclick="onPrompt()"/></br>  
  35. </body>  
  36.   
  37. </html>  


Android代码:

[java]  view plain  copy
  1. package com.example.chenys.webviewdemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.AlertDialog;  
  5. import android.content.DialogInterface;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.webkit.JsPromptResult;  
  9. import android.webkit.JsResult;  
  10. import android.webkit.WebChromeClient;  
  11. import android.webkit.WebSettings;  
  12. import android.webkit.WebView;  
  13. import android.widget.EditText;  
  14. import android.widget.TextView;  
  15.   
  16. /** 
  17.  * Created by mChenys on 2015/11/19. 
  18.  */  
  19. public class TestAlertActivity extends Activity {  
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         WebView webView = new WebView(this);  
  24.         setContentView(webView);  
  25.         webView.requestFocus();  
  26.         WebSettings settings = webView.getSettings();  
  27.         settings.setJavaScriptEnabled(true);//启用支持js  
  28.         //设置响应js 的Alert()函数  
  29.         webView.setWebChromeClient(new WebChromeClient() {  
  30.             @Override  
  31.             public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {  
  32.                 AlertDialog.Builder b = new AlertDialog.Builder(TestAlertActivity.this);  
  33.                 b.setTitle("Alert");  
  34.                 b.setMessage(message);  
  35.                 b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {  
  36.                     @Override  
  37.                     public void onClick(DialogInterface dialog, int which) {  
  38.                         result.confirm();  
  39.                     }  
  40.                 });  
  41.                 b.setCancelable(false);  
  42.                 b.create().show();  
  43.                 return true;  
  44.             }  
  45.             //设置响应js 的Confirm()函数  
  46.             @Override  
  47.             public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {  
  48.                 AlertDialog.Builder b = new AlertDialog.Builder(TestAlertActivity.this);  
  49.                 b.setTitle("Confirm");  
  50.                 b.setMessage(message);  
  51.                 b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {  
  52.                     @Override  
  53.                     public void onClick(DialogInterface dialog, int which) {  
  54.                         result.confirm();  
  55.                     }  
  56.                 });  
  57.                 b.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {  
  58.                     @Override  
  59.                     public void onClick(DialogInterface dialog, int which) {  
  60.                         result.cancel();  
  61.                     }  
  62.                 });  
  63.                 b.create().show();  
  64.                 return true;  
  65.             }  
  66.             //设置响应js 的Prompt()函数  
  67.             @Override  
  68.             public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) {  
  69.                 final View v = View.inflate(TestAlertActivity.this, R.layout.prompt_dialog, null);  
  70.                 ((TextView) v.findViewById(R.id.prompt_message_text)).setText(message);  
  71.                 ((EditText) v.findViewById(R.id.prompt_input_field)).setText(defaultValue);  
  72.                 AlertDialog.Builder b = new AlertDialog.Builder(TestAlertActivity.this);  
  73.                 b.setTitle("Prompt");  
  74.                 b.setView(v);  
  75.                 b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {  
  76.                     @Override  
  77.                     public void onClick(DialogInterface dialog, int which) {  
  78.                         String value = ((EditText) v.findViewById(R.id.prompt_input_field)).getText().toString();  
  79.                         result.confirm(value);  
  80.                     }  
  81.                 });  
  82.                 b.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {  
  83.                     @Override  
  84.                     public void onClick(DialogInterface dialog, int which) {  
  85.                         result.cancel();  
  86.                     }  
  87.                 });  
  88.                 b.create().show();  
  89.                 return true;  
  90.             }  
  91.         });  
  92.         webView.loadUrl("file:///android_asset/index3.html");  
  93.     }  
  94. }  


有2个需要注意的:

1.重写onJsPrompt 方法,需要我们自定一个提示的布局文件,如下:prompt_dialog.xml

就是一个提示的TextView和输入文本的EditTex而已.

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical">  
  6.   
  7.     <TextView  
  8.         android:id="@+id/prompt_message_text"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="wrap_content" />  
  11.   
  12.     <EditText  
  13.         android:id="@+id/prompt_input_field"  
  14.         android:layout_width="match_parent"  
  15.         android:layout_height="wrap_content"  
  16.         android:minWidth="250dp"  
  17.         android:selectAllOnFocus="true"  
  18.         android:scrollHorizontally="true"/>  
  19. </LinearLayout>  

2.WebView需要支持js的话,要记得加启用js的支持.

[java]  view plain  copy
  1. WebSettings settings = webView.getSettings();  
  2. settings.setJavaScriptEnabled(true);  

猜你喜欢

转载自blog.csdn.net/onceing/article/details/79621246