1、对webview封装,在遇到加载页面时可以调用。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#FFFFFF"    android:orientation="vertical" >     <FrameLayout        android:layout_width="fill_parent"        android:layout_height="fill_parent"        >        <WebView            android:id="@+id/webView"            android:layout_width="fill_parent"            android:layout_height="fill_parent" />        <LinearLayout android:id="@+id/ll_loading_dialog"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:background="#88000000"android:orientation="vertical"android:visibility="visible" ><ProgressBarandroid:layout_width="60dip"android:layout_height="60dip" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/data_loading"android:textColor="@android:color/white"android:textSize="@dimen/font_body_12" /></LinearLayout>    </FrameLayout> </LinearLayout>
2、java代码

public class Web {public Web(Activity activity) {super();this.activity = activity;initWebView();}private Activity activity;private LinearLayout mLoadingLayout;private WebView mWebView;/** * 加载详情 */private void initWebView() {mWebView = (WebView) activity.findViewById(R.id.webView);mLoadingLayout = (LinearLayout) activity.findViewById(R.id.ll_loading_dialog);mWebView.setBackgroundColor(0);WebSettings webSettings = mWebView.getSettings();mWebView.requestFocus();webSettings.setJavaScriptEnabled(true);mWebView.setFocusable(true);webSettings.setBuiltInZoomControls(true);mWebView.setScrollBarStyle(0);mWebView.setWebChromeClient(new WebChromeClient() {@Overridepublic void onProgressChanged(WebView view, int newProgress) {Logger.getLogger().i("-----web------"+newProgress);if (newProgress>=100) {mWebView.loadUrl(method);Logger.getLogger().i("-----web load finish ------> "+newProgress);}super.onProgressChanged(view, newProgress);}@Overridepublic boolean onJsAlert(WebView view, String url, String message,final JsResult result) {final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());                          builder.setMessage(message).setPositiveButton("确定", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) { dialog.dismiss(); result.confirm();}});          builder.setOnKeyListener(new OnKeyListener() {              public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {                  return true;              }          });          // 禁止响应按back键的事件          builder.setCancelable(false);          AlertDialog dialog = builder.create();          dialog.show();          return true;  }});mWebView.setWebViewClient(new WebViewClient() {// 重写父类方法,让新打开的网页在当前的WebView中显示@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {loadUrl(view, url);return true;}@Overridepublic void onPageFinished(WebView view, String url) {mLoadingLayout.setVisibility(View.GONE);super.onPageFinished(view, url);}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {mLoadingLayout.setVisibility(View.VISIBLE);super.onPageStarted(view, url, favicon);}});}public void loadUrl(String url) {loadUrl(mWebView, url);}private void loadUrl(final WebView webView, final String url) {webView.loadUrl(url);}/** * 加载方法,网页加载完毕时加载方法,防止加载不到方法 * @param method */public void loadMethod(String method){Logger.getLogger().i(method);this.method = method;}private String method=null;}

3、调用

Web mWeb = new Web(this);mWeb.loadUrl("url");mWeb.loadMethod("javascript:show()");



4、定制对话框

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. importandroid.app.AlertDialog;
  2. importandroid.content.DialogInterface;
  3. importandroid.content.DialogInterface.OnCancelListener;
  4. importandroid.content.DialogInterface.OnClickListener;
  5. importandroid.content.DialogInterface.OnKeyListener;
  6. importandroid.graphics.Bitmap;
  7. importandroid.os.Message;
  8. importandroid.util.Log;
  9. importandroid.view.KeyEvent;
  10. importandroid.webkit.JsPromptResult;
  11. importandroid.webkit.JsResult;
  12. importandroid.webkit.WebChromeClient;
  13. importandroid.webkit.WebView;
  14. importandroid.widget.EditText;
  15. /**
  16. *http://618119.com/archives/2010/12/20/199.html
  17. */
  18. //****************************************************************************
  19. publicclassMyWebChromeClientextendsWebChromeClient{
  20. @Override
  21. publicvoidonCloseWindow(WebViewwindow){
  22. super.onCloseWindow(window);
  23. }
  24. @Override
  25. publicbooleanonCreateWindow(WebViewview,booleandialog,
  26. booleanuserGesture,MessageresultMsg){
  27. returnsuper.onCreateWindow(view,dialog,userGesture,resultMsg);
  28. }
  29. /**
  30. *覆盖默认的window.alert展示界面,避免title里显示为“:来自file:////”
  31. */
  32. publicbooleanonJsAlert(WebViewview,Stringurl,Stringmessage,
  33. JsResultresult){
  34. finalAlertDialog.Builderbuilder=newAlertDialog.Builder(view.getContext());
  35. builder.setTitle("对话框")
  36. .setMessage(message)
  37. .setPositiveButton("确定",null);
  38. //不需要绑定按键事件
  39. //屏蔽keycode等于84之类的按键
  40. builder.setOnKeyListener(newOnKeyListener(){
  41. publicbooleanonKey(DialogInterfacedialog,intkeyCode,KeyEventevent){
  42. Log.v("onJsAlert","keyCode=="+keyCode+"event="+event);
  43. returntrue;
  44. }
  45. });
  46. //禁止响应按back键的事件
  47. builder.setCancelable(false);
  48. AlertDialogdialog=builder.create();
  49. dialog.show();
  50. result.confirm();//因为没有绑定事件,需要强行confirm,否则页面会变黑显示不了内容。
  51. returntrue;
  52. //returnsuper.onJsAlert(view,url,message,result);
  53. }
  54. publicbooleanonJsBeforeUnload(WebViewview,Stringurl,
  55. Stringmessage,JsResultresult){
  56. returnsuper.onJsBeforeUnload(view,url,message,result);
  57. }
  58. /**
  59. *覆盖默认的window.confirm展示界面,避免title里显示为“:来自file:////”
  60. */
  61. publicbooleanonJsConfirm(WebViewview,Stringurl,Stringmessage,
  62. finalJsResultresult){
  63. finalAlertDialog.Builderbuilder=newAlertDialog.Builder(view.getContext());
  64. builder.setTitle("对话框")
  65. .setMessage(message)
  66. .setPositiveButton("确定",newOnClickListener(){
  67. publicvoidonClick(DialogInterfacedialog,intwhich){
  68. result.confirm();
  69. }
  70. })
  71. .setNeutralButton("取消",newOnClickListener(){
  72. publicvoidonClick(DialogInterfacedialog,intwhich){
  73. result.cancel();
  74. }
  75. });
  76. builder.setOnCancelListener(newOnCancelListener(){
  77. @Override
  78. publicvoidonCancel(DialogInterfacedialog){
  79. result.cancel();
  80. }
  81. });
  82. //屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题
  83. builder.setOnKeyListener(newOnKeyListener(){
  84. @Override
  85. publicbooleanonKey(DialogInterfacedialog,intkeyCode,KeyEventevent){
  86. Log.v("onJsConfirm","keyCode=="+keyCode+"event="+event);
  87. returntrue;
  88. }
  89. });
  90. //禁止响应按back键的事件
  91. //builder.setCancelable(false);
  92. AlertDialogdialog=builder.create();
  93. dialog.show();
  94. returntrue;
  95. //returnsuper.onJsConfirm(view,url,message,result);
  96. }
  97. /**
  98. *覆盖默认的window.prompt展示界面,避免title里显示为“:来自file:////”
  99. *window.prompt('请输入您的域名地址','618119.com');
  100. */
  101. publicbooleanonJsPrompt(WebViewview,Stringurl,Stringmessage,
  102. StringdefaultValue,finalJsPromptResultresult){
  103. finalAlertDialog.Builderbuilder=newAlertDialog.Builder(view.getContext());
  104. builder.setTitle("对话框").setMessage(message);
  105. finalEditTextet=newEditText(view.getContext());
  106. et.setSingleLine();
  107. et.setText(defaultValue);
  108. builder.setView(et)
  109. .setPositiveButton("确定",newOnClickListener(){
  110. publicvoidonClick(DialogInterfacedialog,intwhich){
  111. result.confirm(et.getText().toString());
  112. }
  113. })
  114. .setNeutralButton("取消",newOnClickListener(){
  115. publicvoidonClick(DialogInterfacedialog,intwhich){
  116. result.cancel();
  117. }
  118. });
  119. //屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题
  120. builder.setOnKeyListener(newOnKeyListener(){
  121. publicbooleanonKey(DialogInterfacedialog,intkeyCode,KeyEventevent){
  122. Log.v("onJsPrompt","keyCode=="+keyCode+"event="+event);
  123. returntrue;
  124. }
  125. });
  126. //禁止响应按back键的事件
  127. //builder.setCancelable(false);
  128. AlertDialogdialog=builder.create();
  129. dialog.show();
  130. returntrue;
  131. //returnsuper.onJsPrompt(view,url,message,defaultValue,
  132. //result);
  133. }
  134. @Override
  135. publicvoidonProgressChanged(WebViewview,intnewProgress){
  136. super.onProgressChanged(view,newProgress);
  137. }
  138. @Override
  139. publicvoidonReceivedIcon(WebViewview,Bitmapicon){
  140. super.onReceivedIcon(view,icon);
  141. }
  142. @Override
  143. publicvoidonReceivedTitle(WebViewview,Stringtitle){
  144. super.onReceivedTitle(view,title);
  145. }
  146. @Override
  147. publicvoidonRequestFocus(WebViewview){
  148. super.onRequestFocus(view);
  149. }
  150. }




更多相关文章

  1. Android(安卓)ViewStub
  2. 图片加载框架简单介绍 ImageLoader 的基本使用
  3. Android(安卓)PreferenceScreen和CheckBoxPreference的用法
  4. Android之dialog实现底部出现对话框
  5. android全屏问题(隐藏虚拟按键)
  6. Android(安卓)后台线程弹对话框导致程序崩溃(is not valid; is y
  7. android 高效显示Bitmap - 开发文档翻译
  8. android中访问 webView加载URL时的response数据
  9. Android之Fragment动态加载、Fragment与Activity传值通信

随机推荐

  1. Android 架构简介
  2. android 根据设置的日期获取星期几
  3. Android 程式开发:(一)详解活动 —— 1.1 Ac
  4. 借一个项目谈Android应用软件架构,你还在
  5. React-Native在android原生上的绘制流程
  6. Android进程分类与管理
  7. Android 深入了解 Handler 和 Looper
  8. Android无障碍总结
  9. 从零开始学习Android开发-Android概览
  10. Android中的gen文件为空或者不存在的处理