額,還是那個WebView的問題,內核已換成騰訊X5內核,所以接下來的內容會有一些X5內核的方法。但我們的H5是不能改的,還是只有委屈我們自己。先看看H5自帶的彈窗
這樣子的彈窗在不同的手機上呈現的可能是不同的效果,效果不統一,你家產品經理看了會高興嗎?哈哈哈。 其中,onJsPrompt彈出的內容在我們現在的項目上是無意義的。這個是之前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;}
復制代碼
result.confirm();
就是默認點確定,同理result.cancel();
是取消操作
這樣就可以輕松地屏蔽gay_init:2這樣的無意義彈窗了,具體的可以根據message或者defaultValue的值來判斷是否執行其他操作。 接下來是onJsAlert和onJsConfirm類型的,這樣的彈窗我可是一眼就辨別出來了,因為從按鍵個數基本確定,onJsAlert只有一個,onJsConfirm嘛,肯定是有一個取消一個確定了。如果不能確定類型,可以分別復寫幾個方法,打上斷點或者Log一下,也可以找到。
既然他倆就一個按鍵的區別,那就只貼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>
復制代碼
類里面:
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信息設置到布局中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) {//根據isCertain來判斷用戶希望執行的是確定還是取消操作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;}
復制代碼
效果嘛,就這樣啦。
一直以來,WebView對我來說是一個很難控制但是又不得不用的重要組件。經歷了很多坑,包括谷歌大佬埋下的。不管怎么說,我們在遇到問題的時候,要不畏艱難,迎難而上。沒有問題,制造問題,也要上。不要慫,就是干!共勉。