WebView 处理javascript的常用对话框

WebView浏览网页:
    android提供了WebView控件专门用来浏览网页,和其他控件一样,它使用起来非常简单。首先需要在xml布局文件中定义一个WebView控件,代码如下:
 <WebView 
        android:id="@+id/webview01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

    然后在程序中装载这个控件,设置其属性,比如:颜色、字体、要访问的网址等(当然可以在xml中定义),下面的代码通过loadUrl方法设置了当前WebView需要访问的网址:
mWebView = (WebView)findViewById(R.id.webview01);
mWebView.loadUrl("http://www.baidu.com");
    在android中专门通过WebSettings来设置WebView的一些属性、状态等。在创建WebView时,系统有一个默认的设置,我们可以通过WebView.getSettings来得到这个设置。代码如下:
    //取得mWebView的WebSettings对象
    WebSettings webSettings = mWebView.getSettings();
    WebSettings和WebView都在同一个生命周期中存在,当WebView被销毁后,如果在使用WebSettings则会抛出IllegalStateException。

    通过上述方法就可以浏览网页了,但是是通过调用系统浏览器来完成的。那么如何才能在应用程序中自定义网页浏览程序呢,可以通过使用WebViewClient来完成这个功能。
    WebViewClient就是专门辅助WebView处理各种通知、请求等事件的类。我们可以通过WebView的setWebViewClient方法来指定一个WebViewClient对象。代码如下(我们设置覆盖shouldOverrideUrlLoading方法,使得当有新连接时,使用当前的WebView来显示):
  mWebView.setWebViewClient(new WebViewClient(){
         @Override
         public boolean shouldOverrideUrlLoading(WebView view, String url) {
         view.loadUrl(url);
         return true;
         }
    }

    通过WebViewClient可以浏览网页的大部分内容,但是现在很多网页中使用了javascript脚本语言,比如用javascript实现的对话框。这时该如何处理呢?android中提供另一个终于的类WebChromeClient,专门用来辅助WebView处理javascript的对话框、网站图标、网站title、加载进度等。

下面通过一个实际的例子来看一下WebView是怎样处理javascript的对话框的。首先需要一个资源文件dialog.html,内容如下:
[html]  view plain copy
  1. <%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%>  
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  3. <html xmlns="http://www.w3.org/1999/xhtml">  
  4. <head>  
  5. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />  
  6. <title>分别测试javascript的三种对话框</title>  
  7. <script language="javascript">  
  8. function ale()  
  9. {  
  10.     alert("这是一个警告对话框!");  
  11. }  
  12. function firm()  
  13. {  
  14.     if(confirm("去百度看看?"))  
  15.     {  
  16.         location.href="http://www.baidu.com";  
  17.     }  
  18.     else  
  19.     {  
  20.         alert("你选择了不去!");  
  21.     }  
  22. }  
  23. function prom()  
  24. {  
  25.     var str=prompt("演示一个带输入的对话框","这里输入你的信息");  
  26.     if(str)  
  27.     {  
  28.         alert("谢谢使用,你输入的是:"+ str)  
  29.     }  
  30. }  
  31. </script>  
  32. </head>  
  33. <body>  
  34. <p>下面我们演示3种对话框</p>  
  35. <p>警告、提醒对话框</p>  
  36. <p>  
  37.   <input type="submit" name="Submit" value="提交" onclick="ale()" />  
  38. </p>  
  39. <p>带选择的对话框</p>  
  40. <p>  
  41.   <input type="submit" name="Submit2" value="提交" onclick="firm()" />  
  42. </p>  
  43. <p>要求用户输入的对话框</p>  
  44. <p>  
  45.   <input type="submit" name="Submit3" value="提交" onclick="prom()" />  
  46. </p>  
  47. </body>  
  48. </html>  

main.xml文件内容如下:
[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="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <Button  
  8.         android:id="@+id/button01"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:text="button01"  
  12.         />  
  13.     <EditText  
  14.         android:id="@+id/edittext01"  
  15.         android:layout_width="fill_parent"  
  16.         android:layout_height="wrap_content"/>  
  17.     <WebView   
  18.         android:id="@+id/webview01"  
  19.         android:layout_width="fill_parent"  
  20.         android:layout_height="wrap_content"  
  21.         />  
  22.   
  23. </LinearLayout>  

prom_dialog.xml文件内容如下:
[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="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:gravity="center_horizontal"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <TextView  
  9.         android:id="@+id/TextView_PROM"  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="wrap_content" />  
  12.   
  13.     <EditText  
  14.         android:id="@+id/EditText_PROM"  
  15.         android:layout_width="fill_parent"  
  16.         android:layout_height="wrap_content"  
  17.         android:scrollHorizontally="true"  
  18.         android:selectAllOnFocus="true" />  
  19.   
  20. </LinearLayout>  

activity代码如下:
[java]  view plain copy
  1. package com.android;  
  2.   
  3. import android.view.View.OnClickListener;  
  4. import android.app.Activity;  
  5. import android.app.AlertDialog;  
  6. import android.app.AlertDialog.Builder;  
  7. import android.content.DialogInterface;  
  8. import android.graphics.Bitmap;  
  9. import android.os.Bundle;  
  10. import android.util.Log;  
  11. import android.view.KeyEvent;  
  12. import android.view.LayoutInflater;  
  13. import android.view.View;  
  14. import android.view.Window;  
  15. import android.webkit.JsPromptResult;  
  16. import android.webkit.JsResult;  
  17. import android.webkit.URLUtil;  
  18. import android.webkit.WebChromeClient;  
  19. import android.webkit.WebSettings;  
  20. import android.webkit.WebView;  
  21. import android.webkit.WebViewClient;  
  22. import android.widget.Button;  
  23. import android.widget.EditText;  
  24. import android.widget.TextView;  
  25.   
  26. public class MainActivity extends Activity {  
  27.     private final String TAG = "MainActivity";  
  28.     private Button mButton;  
  29.     private EditText mEditText;  
  30.     private WebView mWebView;  
  31.     /** Called when the activity is first created. */  
  32.     @Override  
  33.     public void onCreate(Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         setContentView(R.layout.main);  
  36.           
  37.         mButton = (Button)findViewById(R.id.button01);  
  38.         mEditText = (EditText)findViewById(R.id.edittext01);  
  39.         mWebView = (WebView)findViewById(R.id.webview01);  
  40.         //设置支持javascript脚本  
  41.         WebSettings webSettings = mWebView.getSettings();  
  42.         webSettings.setJavaScriptEnabled(true);  
  43.         //设置可以访问文件  
  44.         webSettings.setAllowFileAccess(true);  
  45.         //设置支持缩放  
  46.         webSettings.setBuiltInZoomControls(true);  
  47.         //设置WebViewClient  
  48.         mWebView.setWebViewClient(new WebViewClient(){  
  49.             @Override  
  50.             public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  51.                 view.loadUrl(url);  
  52.                 return true;  
  53.             }  
  54.             @Override  
  55.             public void onPageFinished(WebView view, String url) {  
  56.                 super.onPageFinished(view, url);  
  57.             }  
  58.             @Override  
  59.             public void onPageStarted(WebView view, String url, Bitmap favicon) {  
  60.                 super.onPageStarted(view, url, favicon);  
  61.             }  
  62.         });  
  63.         //设置WebChromeClient  
  64.         mWebView.setWebChromeClient(new WebChromeClient(){  
  65.             //处理javascript中的alert  
  66.             @Override  
  67.             public boolean onJsAlert(WebView view, String url, String message,  
  68.                     final JsResult result) {  
  69.                 //构架一个builder来显示网页中的对话框  
  70.                 Builder builder = new Builder(MainActivity.this);  
  71.                 builder.setTitle("提示对话框");  
  72.                 builder.setMessage(message);  
  73.                 builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener(){  
  74.                     @Override  
  75.                     public void onClick(DialogInterface dialog, int which) {  
  76.                         //点击确定按钮之后,继续执行网页中的操作  
  77.                         result.confirm();  
  78.                     }  
  79.                 });  
  80.                 builder.setCancelable(false);  
  81.                 builder.create();  
  82.                 builder.show();  
  83.                 return true;  
  84.             }  
  85.              //处理javascript中的confirm  
  86.             @Override  
  87.             public boolean onJsConfirm(WebView view, String url,  
  88.                     String message, final JsResult result) {  
  89.                 Builder builder = new Builder(MainActivity.this);  
  90.                 builder.setTitle("待选择的对话框");  
  91.                 builder.setMessage(message);  
  92.                 builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {  
  93.                     @Override  
  94.                     public void onClick(DialogInterface dialog, int which) {  
  95.                         result.confirm();  
  96.                     }  
  97.                 });  
  98.                 builder.setNegativeButton(android.R.string.cancel, new AlertDialog.OnClickListener() {  
  99.                     @Override  
  100.                     public void onClick(DialogInterface dialog, int which) {  
  101.                         result.cancel();  
  102.                     }  
  103.                 });  
  104.                 builder.setCancelable(false);  
  105.                 builder.create();  
  106.                 builder.show();  
  107.                 return true;  
  108.             }  
  109.             //处理javascript中的prompt  
  110.             //message为网页中对话框的提示内容  
  111.             //defaultValue为没有输入时默认显示的内容  
  112.             @Override  
  113.             public boolean onJsPrompt(WebView view, String url, String message,  
  114.                     String defaultValue, final JsPromptResult result) {  
  115.                 //自定义一个带输入的对话框由TextView和Edittext构成  
  116.                 final LayoutInflater factory = LayoutInflater.from(MainActivity.this)   ;  
  117.                 final View dialogView = factory.inflate(R.layout.prom_dialog, null);  
  118.                 //设置TextView对应网页中的提示信息  
  119.                 ((TextView)dialogView.findViewById(R.id.TextView_PROM)).setText(defaultValue);  
  120.                 //设置EditText对应网页中的输入框  
  121.                 ((EditText)dialogView.findViewById(R.id.EditText_PROM)).setText(defaultValue);  
  122.                 Builder builder = new Builder(MainActivity.this);  
  123.                 builder.setTitle("带输入的对话框");  
  124.                 builder.setView(dialogView);  
  125.                 builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {  
  126.                     public void onClick(DialogInterface dialog, int which) {  
  127.                         // 点击确定之后,取得输入的值,传给网页处理  
  128.                         String value = ((EditText)dialogView.findViewById(R.id.EditText_PROM)).getText().toString();  
  129.                         result.confirm(value);  
  130.                     }  
  131.                 });  
  132.                 builder.setNegativeButton(android.R.string.cancel, new AlertDialog.OnClickListener() {  
  133.                     public void onClick(DialogInterface dialog, int which) {  
  134.                         result.cancel();  
  135.                     }  
  136.                 });  
  137.                 builder.setOnCancelListener(new AlertDialog.OnCancelListener() {  
  138.                     public void onCancel(DialogInterface dialog) {  
  139.                         result.cancel();  
  140.                     }  
  141.                 });  
  142.                 builder.show();  
  143.                 return true;  
  144.             }  
  145.             //设置网页的加载的进度条  
  146.             @Override  
  147.             public void onProgressChanged(WebView view, int newProgress) {  
  148.                 MainActivity.this.getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress);  
  149.                 super.onProgressChanged(view, newProgress);  
  150.             }  
  151.             //设置应用程序的标题title  
  152.             @Override  
  153.             public void onReceivedTitle(WebView view, String title) {  
  154.                 MainActivity.this.setTitle(title);  
  155.                 super.onReceivedTitle(view, title);  
  156.             }  
  157.         });  
  158.         mButton.setOnClickListener(new OnClickListener() {  
  159.             @Override  
  160.             public void onClick(View v) {  
  161.                 try{  
  162.                     //取得编辑框中输入的内容  
  163.                     String url = mEditText.getText().toString();  
  164.                     //判断输入的内容是不是网址  
  165.                     if(URLUtil.isNetworkUrl(url)){  
  166.                         //装载网址  
  167.                         mWebView.loadUrl(url);  
  168.                     }else{  
  169.                         mEditText.setText("输入网址错误");  
  170.                     }  
  171.                 }catch (Exception e) {  
  172.                     Log.e(TAG, e.toString());  
  173.                 }  
  174.             }  
  175.         });  
  176.     }  
  177.     @Override  
  178.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  179.         if((keyCode==KeyEvent.KEYCODE_BACK) && (mWebView.canGoBack())){  
  180.             //返回前一个页面  
  181.             mWebView.goBack();  
  182.             return true;  
  183.         }  
  184.         return super.onKeyDown(keyCode, event);  
  185.     }  
  186. }  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值