Android(安卓)WebView封装及定制js的alert,confirm和prompt对话框的方法
16lz
2021-01-25
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()");
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的代码如下:
- importandroid.app.AlertDialog;
- importandroid.content.DialogInterface;
- importandroid.content.DialogInterface.OnCancelListener;
- importandroid.content.DialogInterface.OnClickListener;
- importandroid.content.DialogInterface.OnKeyListener;
- importandroid.graphics.Bitmap;
- importandroid.os.Message;
- importandroid.util.Log;
- importandroid.view.KeyEvent;
- importandroid.webkit.JsPromptResult;
- importandroid.webkit.JsResult;
- importandroid.webkit.WebChromeClient;
- importandroid.webkit.WebView;
- importandroid.widget.EditText;
- /**
- *http://618119.com/archives/2010/12/20/199.html
- */
- //****************************************************************************
- publicclassMyWebChromeClientextendsWebChromeClient{
- @Override
- publicvoidonCloseWindow(WebViewwindow){
- super.onCloseWindow(window);
- }
- @Override
- publicbooleanonCreateWindow(WebViewview,booleandialog,
- booleanuserGesture,MessageresultMsg){
- returnsuper.onCreateWindow(view,dialog,userGesture,resultMsg);
- }
- /**
- *覆盖默认的window.alert展示界面,避免title里显示为“:来自file:////”
- */
- publicbooleanonJsAlert(WebViewview,Stringurl,Stringmessage,
- JsResultresult){
- finalAlertDialog.Builderbuilder=newAlertDialog.Builder(view.getContext());
- builder.setTitle("对话框")
- .setMessage(message)
- .setPositiveButton("确定",null);
- //不需要绑定按键事件
- //屏蔽keycode等于84之类的按键
- builder.setOnKeyListener(newOnKeyListener(){
- publicbooleanonKey(DialogInterfacedialog,intkeyCode,KeyEventevent){
- Log.v("onJsAlert","keyCode=="+keyCode+"event="+event);
- returntrue;
- }
- });
- //禁止响应按back键的事件
- builder.setCancelable(false);
- AlertDialogdialog=builder.create();
- dialog.show();
- result.confirm();//因为没有绑定事件,需要强行confirm,否则页面会变黑显示不了内容。
- returntrue;
- //returnsuper.onJsAlert(view,url,message,result);
- }
- publicbooleanonJsBeforeUnload(WebViewview,Stringurl,
- Stringmessage,JsResultresult){
- returnsuper.onJsBeforeUnload(view,url,message,result);
- }
- /**
- *覆盖默认的window.confirm展示界面,避免title里显示为“:来自file:////”
- */
- publicbooleanonJsConfirm(WebViewview,Stringurl,Stringmessage,
- finalJsResultresult){
- finalAlertDialog.Builderbuilder=newAlertDialog.Builder(view.getContext());
- builder.setTitle("对话框")
- .setMessage(message)
- .setPositiveButton("确定",newOnClickListener(){
- publicvoidonClick(DialogInterfacedialog,intwhich){
- result.confirm();
- }
- })
- .setNeutralButton("取消",newOnClickListener(){
- publicvoidonClick(DialogInterfacedialog,intwhich){
- result.cancel();
- }
- });
- builder.setOnCancelListener(newOnCancelListener(){
- @Override
- publicvoidonCancel(DialogInterfacedialog){
- result.cancel();
- }
- });
- //屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题
- builder.setOnKeyListener(newOnKeyListener(){
- @Override
- publicbooleanonKey(DialogInterfacedialog,intkeyCode,KeyEventevent){
- Log.v("onJsConfirm","keyCode=="+keyCode+"event="+event);
- returntrue;
- }
- });
- //禁止响应按back键的事件
- //builder.setCancelable(false);
- AlertDialogdialog=builder.create();
- dialog.show();
- returntrue;
- //returnsuper.onJsConfirm(view,url,message,result);
- }
- /**
- *覆盖默认的window.prompt展示界面,避免title里显示为“:来自file:////”
- *window.prompt('请输入您的域名地址','618119.com');
- */
- publicbooleanonJsPrompt(WebViewview,Stringurl,Stringmessage,
- StringdefaultValue,finalJsPromptResultresult){
- finalAlertDialog.Builderbuilder=newAlertDialog.Builder(view.getContext());
- builder.setTitle("对话框").setMessage(message);
- finalEditTextet=newEditText(view.getContext());
- et.setSingleLine();
- et.setText(defaultValue);
- builder.setView(et)
- .setPositiveButton("确定",newOnClickListener(){
- publicvoidonClick(DialogInterfacedialog,intwhich){
- result.confirm(et.getText().toString());
- }
- })
- .setNeutralButton("取消",newOnClickListener(){
- publicvoidonClick(DialogInterfacedialog,intwhich){
- result.cancel();
- }
- });
- //屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题
- builder.setOnKeyListener(newOnKeyListener(){
- publicbooleanonKey(DialogInterfacedialog,intkeyCode,KeyEventevent){
- Log.v("onJsPrompt","keyCode=="+keyCode+"event="+event);
- returntrue;
- }
- });
- //禁止响应按back键的事件
- //builder.setCancelable(false);
- AlertDialogdialog=builder.create();
- dialog.show();
- returntrue;
- //returnsuper.onJsPrompt(view,url,message,defaultValue,
- //result);
- }
- @Override
- publicvoidonProgressChanged(WebViewview,intnewProgress){
- super.onProgressChanged(view,newProgress);
- }
- @Override
- publicvoidonReceivedIcon(WebViewview,Bitmapicon){
- super.onReceivedIcon(view,icon);
- }
- @Override
- publicvoidonReceivedTitle(WebViewview,Stringtitle){
- super.onReceivedTitle(view,title);
- }
- @Override
- publicvoidonRequestFocus(WebViewview){
- super.onRequestFocus(view);
- }
- }
更多相关文章
- Android(安卓)ViewStub
- 图片加载框架简单介绍 ImageLoader 的基本使用
- Android(安卓)PreferenceScreen和CheckBoxPreference的用法
- Android之dialog实现底部出现对话框
- android全屏问题(隐藏虚拟按键)
- Android(安卓)后台线程弹对话框导致程序崩溃(is not valid; is y
- android 高效显示Bitmap - 开发文档翻译
- android中访问 webView加载URL时的response数据
- Android之Fragment动态加载、Fragment与Activity传值通信