Android 自定义WebView弹窗及屏蔽弹窗
額,還是那個WebView的問題,內(nèi)核已換成騰訊X5內(nèi)核,所以接下來的內(nèi)容會有一些X5內(nèi)核的方法。但我們的H5是不能改的,還是只有委屈我們自己。先看看H5自帶的彈窗
這樣子的彈窗在不同的手機上呈現(xiàn)的可能是不同的效果,效果不統(tǒng)一,你家產(chǎn)品經(jīng)理看了會高興嗎?哈哈哈。 其中,onJsPrompt彈出的內(nèi)容在我們現(xiàn)在的項目上是無意義的。這個是之前AngularJS和Cordava項目。于是乎,對于onJsPrompt彈窗,我的做法是:
@Overridepublic boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {//在defaultValue或message中,會返回一個url,我們項目中的下載的文件都是File路徑下//如果不是File文件,則直接返回true來屏蔽彈窗。if (!defaultValue.contains("File") && !message.contains("File")) {result.confirm();return true;}result.confirm();webView.loadUrl(message);return true;} 復(fù)制代碼result.confirm();就是默認點確定,同理result.cancel();是取消操作
這樣就可以輕松地屏蔽gay_init:2這樣的無意義彈窗了,具體的可以根據(jù)message或者defaultValue的值來判斷是否執(zhí)行其他操作。 接下來是onJsAlert和onJsConfirm類型的,這樣的彈窗我可是一眼就辨別出來了,因為從按鍵個數(shù)基本確定,onJsAlert只有一個,onJsConfirm嘛,肯定是有一個取消一個確定了。如果不能確定類型,可以分別復(fù)寫幾個方法,打上斷點或者Log一下,也可以找到。
既然他倆就一個按鍵的區(qū)別,那就只貼onJsConfirm的了。樣式是仿照IOS的效果來的,background自定義的,需要的留言,我只貼主要的,畢竟本文主要是講WebView的。
xml文件:
<?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="wrap_content"><TextViewandroid:id="@+id/title"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/content"android:layout_width="match_parent"android:layout_height="wrap_content" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:id="@+id/certain"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="確定" /><Buttonandroid:id="@+id/cancel"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginLeft="@dimen/x1"android:layout_weight="1"android:text="取消"/></LinearLayout> </LinearLayout> 復(fù)制代碼類里面:
private AlertDialog confirmDialog;private boolean isCertain;@Overridepublic boolean onJsConfirm(WebView webView, String url, String message, final JsResult result) {confirmDialog = new AlertDialog.Builder(getContext(), R.style.alert_dialog_style).create();View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.window_user, null);TextView title = (TextView) view.findViewById(R.id.title);TextView content = (TextView) view.findViewById(R.id.content);Button cancel = (Button) view.findViewById(R.id.cancel);Button certain = (Button) view.findViewById(R.id.certain);title.setText("操作提示");//直接將返回的message信息設(shè)置到布局中content.setText("" + message);confirmDialog.setView(view);cancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {confirmDialog.dismiss();isCertain = false;}});certain.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {confirmDialog.dismiss();isCertain = true;}});confirmDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {//根據(jù)isCertain來判斷用戶希望執(zhí)行的是確定還是取消操作if (isCertain) {result.confirm();} else {result.cancel();}}});confirmDialog.show();WindowManager.LayoutParams params = confirmDialog.getWindow().getAttributes();params.width = (int) (ScreenUtils.getScreenWidth() * 0.9);params.height = LinearLayout.LayoutParams.WRAP_CONTENT;confirmDialog.getWindow().setAttributes(params);return true;} 復(fù)制代碼效果嘛,就這樣啦。
一直以來,WebView對我來說是一個很難控制但是又不得不用的重要組件。經(jīng)歷了很多坑,包括谷歌大佬埋下的。不管怎么說,我們在遇到問題的時候,要不畏艱難,迎難而上。沒有問題,制造問題,也要上。不要慫,就是干!共勉。
轉(zhuǎn)載于:https://juejin.im/post/5a313cdc51882575cb741bd5
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Android 自定义WebView弹窗及屏蔽弹窗的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手把手教你用Java设计并实现一个城市公
- 下一篇: 自定义计算器 android,Andro