Android 自定義WebView彈窗及屏蔽彈窗

額,還是那個WebView的問題,內(nèi)核已換成騰訊X5內(nèi)核,所以接下來的內(nèi)容會有一些X5內(nèi)核的方法。但我們的H5是不能改的,還是只有委屈我們自己。先看看H5自帶的彈窗

不知道什么鬼彈窗,應該是onJsPrompt

這樣子的彈窗在不同的手機上呈現(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一下,也可以找到。

onJsAlert彈窗
onJsConfirm彈窗

既然他倆就一個按鍵的區(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;
    }

效果嘛,就這樣啦。

優(yōu)化后的onJsAlert彈窗
優(yōu)化后的onJsConfirm彈窗

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于 android Webview 基本使用 加載html四種方式 簡單使用 在AndroidManifest....
    小面包屑閱讀 5,638評論 2 13
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,173評論 25 708
  • 關(guān)于這份調(diào)研報告,不是從技術(shù)角度深入探索,重點是從產(chǎn)品本身分析,通俗易懂才是重點。主要是為了鍛煉平時做技術(shù)調(diào)研和競...
    石先閱讀 23,892評論 13 48
  • 前言 總結(jié) Android WebView 常用的相關(guān)知識點,令包含以下干貨內(nèi)容分析:Js注入漏洞、WebView...
    無名小子的雜貨鋪閱讀 70,126評論 17 169
  • 最基礎(chǔ)的使用方法 最簡單的布局: 在Activity中使用WebView: 但只是這樣的話,在模擬器上是會直接調(diào)到...
    HolenZhou閱讀 7,948評論 12 33

友情鏈接更多精彩內(nèi)容