使用 WebView 处理javascript的常用对话框

来源:互联网 发布:如何自学成为sql工程师 编辑:程序博客网 时间:2024/05/27 20:52
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,内容如下:
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>分别测试javascript的三种对话框</title><script language="javascript">function ale(){    alert("这是一个警告对话框!");}function firm(){    if(confirm("去百度看看?"))    {        location.href="http://www.baidu.com";    }    else    {        alert("你选择了不去!");    }}function prom(){    var str=prompt("演示一个带输入的对话框","这里输入你的信息");    if(str)    {        alert("谢谢使用,你输入的是:"+ str)    }}</script></head><body><p>下面我们演示3种对话框</p><p>警告、提醒对话框</p><p>  <input type="submit" name="Submit" value="提交" onclick="ale()" /></p><p>带选择的对话框</p><p>  <input type="submit" name="Submit2" value="提交" onclick="firm()" /></p><p>要求用户输入的对话框</p><p>  <input type="submit" name="Submit3" value="提交" onclick="prom()" /></p></body></html>

main.xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <Button        android:id="@+id/button01"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="button01"        />    <EditText        android:id="@+id/edittext01"        android:layout_width="fill_parent"        android:layout_height="wrap_content"/>    <WebView         android:id="@+id/webview01"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        /></LinearLayout>

prom_dialog.xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:gravity="center_horizontal"    android:orientation="vertical" >    <TextView        android:id="@+id/TextView_PROM"        android:layout_width="fill_parent"        android:layout_height="wrap_content" />    <EditText        android:id="@+id/EditText_PROM"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:scrollHorizontally="true"        android:selectAllOnFocus="true" /></LinearLayout>

activity代码如下:
package com.android;import android.view.View.OnClickListener;import android.app.Activity;import android.app.AlertDialog;import android.app.AlertDialog.Builder;import android.content.DialogInterface;import android.graphics.Bitmap;import android.os.Bundle;import android.util.Log;import android.view.KeyEvent;import android.view.LayoutInflater;import android.view.View;import android.view.Window;import android.webkit.JsPromptResult;import android.webkit.JsResult;import android.webkit.URLUtil;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;public class MainActivity extends Activity {private final String TAG = "MainActivity";private Button mButton;private EditText mEditText;private WebView mWebView;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                mButton = (Button)findViewById(R.id.button01);        mEditText = (EditText)findViewById(R.id.edittext01);        mWebView = (WebView)findViewById(R.id.webview01);        //设置支持javascript脚本        WebSettings webSettings = mWebView.getSettings();        webSettings.setJavaScriptEnabled(true);        //设置可以访问文件        webSettings.setAllowFileAccess(true);        //设置支持缩放        webSettings.setBuiltInZoomControls(true);        //设置WebViewClient        mWebView.setWebViewClient(new WebViewClient(){        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {        view.loadUrl(url);        return true;        }        @Override        public void onPageFinished(WebView view, String url) {        super.onPageFinished(view, url);        }        @Override        public void onPageStarted(WebView view, String url, Bitmap favicon) {        super.onPageStarted(view, url, favicon);        }        });        //设置WebChromeClient        mWebView.setWebChromeClient(new WebChromeClient(){        //处理javascript中的alert        @Override        public boolean onJsAlert(WebView view, String url, String message,        final JsResult result) {        //构架一个builder来显示网页中的对话框        Builder builder = new Builder(MainActivity.this);        builder.setTitle("提示对话框");        builder.setMessage(message);        builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener(){        @Override        public void onClick(DialogInterface dialog, int which) {        //点击确定按钮之后,继续执行网页中的操作        result.confirm();        }        });        builder.setCancelable(false);        builder.create();        builder.show();        return true;        }         //处理javascript中的confirm        @Override        public boolean onJsConfirm(WebView view, String url,        String message, final JsResult result) {        Builder builder = new Builder(MainActivity.this);        builder.setTitle("待选择的对话框");        builder.setMessage(message);        builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {result.confirm();}});        builder.setNegativeButton(android.R.string.cancel, new AlertDialog.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {result.cancel();}});        builder.setCancelable(false);        builder.create();        builder.show();        return true;        }        //处理javascript中的prompt        //message为网页中对话框的提示内容        //defaultValue为没有输入时默认显示的内容        @Override        public boolean onJsPrompt(WebView view, String url, String message,        String defaultValue, final JsPromptResult result) {        //自定义一个带输入的对话框由TextView和Edittext构成        final LayoutInflater factory = LayoutInflater.from(MainActivity.this);        final View dialogView = factory.inflate(R.layout.prom_dialog, null);        //设置TextView对应网页中的提示信息        ((TextView)dialogView.findViewById(R.id.TextView_PROM)).setText(defaultValue);        //设置EditText对应网页中的输入框        ((EditText)dialogView.findViewById(R.id.EditText_PROM)).setText(defaultValue);        Builder builder = new Builder(MainActivity.this);        builder.setTitle("带输入的对话框");        builder.setView(dialogView);        builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {public void onClick(DialogInterface dialog, int which) {// 点击确定之后,取得输入的值,传给网页处理String value = ((EditText)dialogView.findViewById(R.id.EditText_PROM)).getText().toString();result.confirm(value);}});        builder.setNegativeButton(android.R.string.cancel, new AlertDialog.OnClickListener() {public void onClick(DialogInterface dialog, int which) {result.cancel();}});        builder.setOnCancelListener(new AlertDialog.OnCancelListener() {public void onCancel(DialogInterface dialog) {result.cancel();}});        builder.show();        return true;        }        //设置网页的加载的进度条        @Override        public void onProgressChanged(WebView view, int newProgress) {        MainActivity.this.getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress);        super.onProgressChanged(view, newProgress);        }        //设置应用程序的标题title        @Override        public void onReceivedTitle(WebView view, String title) {        MainActivity.this.setTitle(title);        super.onReceivedTitle(view, title);        }        });        mButton.setOnClickListener(new OnClickListener() {           @Override    public void onClick(View v) {    try{    //取得编辑框中输入的内容    String url = mEditText.getText().toString();    //判断输入的内容是不是网址    if(URLUtil.isNetworkUrl(url)){    //装载网址    mWebView.loadUrl(url);    }else{    mEditText.setText("输入网址错误");    }    }catch (Exception e) {    Log.e(TAG, e.toString());    }    }});    }    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {    if((keyCode==KeyEvent.KEYCODE_BACK) && (mWebView.canGoBack())){    //返回前一个页面    mWebView.goBack();    return true;    }    return super.onKeyDown(keyCode, event);    }}


原创粉丝点击