使用 WebView 处理javascript的常用对话框
来源:互联网 发布:如何自学成为sql工程师 编辑:程序博客网 时间:2024/05/27 20:52
WebView浏览网页:
main.xml文件内容如下:
prom_dialog.xml文件内容如下:
activity代码如下:
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); }}
- 使用 WebView 处理javascript的常用对话框
- WebView 处理javascript的常用对话框
- webview中处理js的对话框
- 【javascript】javascript常用的三种对话框
- Android WebView 不能弹出alert的对话框的处理
- 关于Android中webview交互弹出网页对话框的处理
- javascript常用对话框
- javascript的高级使用,设置页面元素是否相应事件与显示“正在处理”对话框
- 使用WebView弹出不支持localStoragede对话框的问题
- Android WebView与JavaScript的交互使用
- WebView中使用javascript
- webview使用javascript混淆
- JavaScript 简单对话框的使用(提交,确认,输入对话框)
- WebView错误码处理,及常用的方法
- JavaScript 几个常用的弹出对话框提示案例
- WebView的常用设置
- Webview常用的方法
- WebView的超时处理
- strcpy, sprintf,memcpy的区别
- Oracle中常用的修改表操作的sql语句
- Oracle语句优化53个规则详解(1)
- 经典的Android案例项目源码
- Linux文件查找命令find,xargs详述
- 使用 WebView 处理javascript的常用对话框
- How to make your app support Galaxy note
- Centos6 安装 gnome桌面
- [Objective-C]Class类型、class方法
- chain.doFilter(request,response)的作用
- fedora nfs
- Use Alt/Meta In a Terminal
- Java的垃圾回收机制详解和调优
- 3个故事看穿了很多人