額,還是那個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彈窗,我的做法是:
@Override
public 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這樣的無意義彈窗了,具體的可以根據(jù)message或者defaultValue的值來判斷是否執(zhí)行其他操作。
接下來是onJsAlert和onJsConfirm類型的,這樣的彈窗我可是一眼就辨別出來了,因為從按鍵個數(shù)基本確定,onJsAlert只有一個,onJsConfirm嘛,肯定是有一個取消一個確定了。如果不能確定類型,可以分別復寫幾個方法,打上斷點或者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">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/certain"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="確定" />
<Button
android: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;
@Override
public 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() {
@Override
public void onClick(View v) {
confirmDialog.dismiss();
isCertain = false;
}
});
certain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
confirmDialog.dismiss();
isCertain = true;
}
});
confirmDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public 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;
}
效果嘛,就這樣啦。


一直以來,WebView對我來說是一個很難控制但是又不得不用的重要組件。經(jīng)歷了很多坑,包括谷歌大佬埋下的。不管怎么說,我們在遇到問題的時候,要不畏艱難,迎難而上。沒有問題,制造問題,也要上。不要慫,就是干!共勉。