【问题标题】:Android Alert with "Don't show again" checkbox in WebviewWebview 中带有“不再显示”复选框的 Android 警报
【发布时间】:2017-09-11 08:54:36
【问题描述】:

我有一个网络视图,点击帮助 JavaScript 界面时,它会从网络视图打开我的 android 活动在这里它工作正常...

所以当用户点击任何一个 JS 接口的按钮时,我已经添加了一个警报

所以当用户点击它时...它会显示一个对话框...

现在我跟着 this 添加了一个选项,例如 Don't ask again...。复选框

这里我给出了共享首选项和复选框...但它不起作用...

还有一件事,该复选框在网络视图中是可行的......它应该只在警报时显示......但它一直显示......

任何人都可以建议我..如何使用复选框显示警报..不要在 android Webview 中再次询问...并记住复选框...

java.lang.RuntimeException: Unable to start activity ComponentInfo{Mypackage/myactivity}: android.view.InflateException: Binary XML file line #18: Error inflating class checkbox

更新

这里是my code,为此我添加了example code... at alert...

实际上,我需要一个不带 XML 的复选框...(由于复选框的 XML,我的主 Web 视图出现了一些错误) 有可能吗.. 如果可以,请告诉我...

【问题讨论】:

    标签: javascript android checkbox webview sharedpreferences


    【解决方案1】:

    我将把你的问题分成两部分

    1) 显示对话框并记住用户是否选择不再显示它

    一个带有共享偏好的简单警报对话框可以做到这一点。

       private void handleAlertDialog() {
        //Handle showAlert
        //check if allow to show dialog
        if (!getSharedPreferences("MyPrefsFile1", MODE_PRIVATE)
                .getBoolean("ShowDialog", false)) {
    
            final CharSequence[] items = {"Would like to Remember this setting ? "};
    
            AlertDialog dialog = new AlertDialog.Builder(WebViewActivity.this)
                    .setTitle("Allow location access")
                    .setMultiChoiceItems(items, null, new DialogInterface.OnMultiChoiceClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int indexSelected, boolean isChecked) {
                            if (isChecked) {
                                //If the user checked the item, add it to the selected items
                                // Don't Allow, remember
    
    
                                getSharedPreferences("MyPrefsFile1", MODE_PRIVATE)
                                        .edit()
                                        .putBoolean("ShowDialog", true).commit();
    
                                Toast.makeText(getApplicationContext(), "Remember", Toast.LENGTH_SHORT).show();
                            } else {
    
    
                                getSharedPreferences("MyPrefsFile1", MODE_PRIVATE)
                                        .edit()
                                        .putBoolean("ShowDialog", false).commit();
    
                                Toast.makeText(getApplicationContext(), "Don't Remember", Toast.LENGTH_SHORT).show();
                            }
                        }
                    }).setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            //  Your code when user clicked on OK
                            //  You can write the code  to save the selected item here
                        }
                    }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            //  Your code when user clicked on Cancel
                        }
                    }).create();
            dialog.show();
        }
    }
    

    2) 从 javascript 触发此方法。

    shouldOverrideUrlLoading(WebView view, String url) 在 Android N 显示您还需要覆盖 shouldOverrideUrlLoading(WebView view, WebResourceRequest request) 后已弃用。

    一个完整的 WebViewClient 类将如下所示。

        /**
        * WebViewClient subclass loads all hyperlinks in the existing WebView
         */
        public class GeoWebViewClient extends WebViewClient {
    
            Dialog loadingDialog = new Dialog(WebViewActivity.this);
    
            @SuppressWarnings("deprecation")
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
    
                if (url.startsWith("mailto:")) {
                    //Handle mail Urls
                    startActivity(new Intent(Intent.ACTION_SENDTO, Uri.parse(url)));
    
                } else if (url.startsWith("tel:")) {
    
                    //Handle telephony Urls
                    startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(url)));
    
                } else if (url.startsWith("showalert:")) {
                    handleAlertDialog();
    
                } else {
                    view.loadUrl(url);
                }
                return true;
            }
    
            @TargetApi(Build.VERSION_CODES.N)
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                final Uri uri = request.getUrl();
                if (uri.toString().startsWith("mailto:")) {
    
                    //Handle mail Urls
                    startActivity(new Intent(Intent.ACTION_SENDTO, uri));
                } else if (uri.toString().startsWith("tel:")) {
    
                    //Handle telephony Urls
                    startActivity(new Intent(Intent.ACTION_DIAL, uri));
                } else if (uri.toString().startsWith("showalert:")) {
    
                     //Handle Alert
                    handleAlertDialog();
    
                } else {
                    //Handle Web Urls
                    view.loadUrl(uri.toString());
                }
                return true;
            }
    
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                webViewPreviousState = PAGE_STARTED;
    
                if (loadingDialog == null || !loadingDialog.isShowing())
                    loadingDialog = ProgressDialog.show(WebViewActivity.this, "",
                            "Loading Please Wait", true, true,
                            new DialogInterface.OnCancelListener() {
    
                                @Override
                                public void onCancel(DialogInterface dialog) {
                                    // do something
                                }
                            });
    
                loadingDialog.setCancelable(false);
            }
    
    
            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request,
                                        WebResourceError error) {
    
    
                if (isConnected()) {
                    final Snackbar snackBar = Snackbar.make(rootView, "onReceivedError : " + error.getDescription(), Snackbar.LENGTH_INDEFINITE);
                    snackBar.setAction("Reload", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            webView.loadUrl("javascript:window.location.reload( true )");
                        }
                    });
                    snackBar.show();
                } else {
                    final Snackbar snackBar = Snackbar.make(rootView, "No Internet Connection ", Snackbar.LENGTH_INDEFINITE);
                    snackBar.setAction("Enable Data", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            startActivityForResult(new Intent(Settings.ACTION_WIRELESS_SETTINGS), 0);
                            webView.loadUrl("javascript:window.location.reload( true )");
                            snackBar.dismiss();
                        }
                    });
                    snackBar.show();
                }
    
                super.onReceivedError(view, request, error);
    
            }
    
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onReceivedHttpError(WebView view,
                                            WebResourceRequest request, WebResourceResponse errorResponse) {
    
                if (isConnected()) {
                    final Snackbar snackBar = Snackbar.make(rootView, "HttpError : " + errorResponse.getReasonPhrase(), Snackbar.LENGTH_INDEFINITE);
    
                    snackBar.setAction("Reload", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            webView.loadUrl("javascript:window.location.reload( true )");
                        }
                    });
                    snackBar.show();
                } else {
                    final Snackbar snackBar = Snackbar.make(rootView, "No Internet Connection ", Snackbar.LENGTH_INDEFINITE);
                    snackBar.setAction("Enable Data", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            startActivityForResult(new Intent(Settings.ACTION_WIRELESS_SETTINGS), 0);
                            webView.loadUrl("javascript:window.location.reload( true )");
                            snackBar.dismiss();
                        }
                    });
                    snackBar.show();
                }
                super.onReceivedHttpError(view, request, errorResponse);
            }
    
            @Override
            public void onPageFinished(WebView view, String url) {
    
                if (webViewPreviousState == PAGE_STARTED) {
    
                    if (null != loadingDialog) {
                        loadingDialog.dismiss();
                        loadingDialog = null;
                    }
                }
            }
        }
    

    isConnected方法用于检查网络连接

    /**
     * Check if there is any connectivity
     *
     * @return is Device Connected
     */
    public boolean isConnected() {
    
        ConnectivityManager cm = (ConnectivityManager)
                this.getSystemService(Context.CONNECTIVITY_SERVICE);
    
        if (null != cm) {
            NetworkInfo info = cm.getActiveNetworkInfo();
            return (info != null && info.isConnected());
        }
    
        return false;
    
    }
    

    如您所见,我添加了一个过滤器来检查以showalert: 开头的 URL。如果我的 Web 客户端类捕获到任何以 showalert 开头的 URL,那么它会触发 handleAlert 方法。

    结果

    2) 从 javascript 触发此方法。

    shouldOverrideUrlLoading(WebView view, String url) 在 Android N 显示您还需要覆盖 shouldOverrideUrlLoading(WebView view, WebResourceRequest request) 后已弃用。

    一个完整的 WebViewClient 类将如下所示。

        /**
        * WebViewClient subclass loads all hyperlinks in the existing WebView
         */
        public class GeoWebViewClient extends WebViewClient {
    
            Dialog loadingDialog = new Dialog(WebViewActivity.this);
    
            @SuppressWarnings("deprecation")
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
    
                if (url.startsWith("mailto:")) {
                    //Handle mail Urls
                    startActivity(new Intent(Intent.ACTION_SENDTO, Uri.parse(url)));
    
                } else if (url.startsWith("tel:")) {
    
                    //Handle telephony Urls
                    startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(url)));
    
                } else if (url.startsWith("showalert:")) {
                    handleAlertDialog();
    
                } else {
                    view.loadUrl(url);
                }
                return true;
            }
    
            @TargetApi(Build.VERSION_CODES.N)
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                final Uri uri = request.getUrl();
                if (uri.toString().startsWith("mailto:")) {
    
                    //Handle mail Urls
                    startActivity(new Intent(Intent.ACTION_SENDTO, uri));
                } else if (uri.toString().startsWith("tel:")) {
    
                    //Handle telephony Urls
                    startActivity(new Intent(Intent.ACTION_DIAL, uri));
                } else if (uri.toString().startsWith("showalert:")) {
    
                     //Handle Alert
                    handleAlertDialog();
    
                } else {
                    //Handle Web Urls
                    view.loadUrl(uri.toString());
                }
                return true;
            }
    
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                webViewPreviousState = PAGE_STARTED;
    
                if (loadingDialog == null || !loadingDialog.isShowing())
                    loadingDialog = ProgressDialog.show(WebViewActivity.this, "",
                            "Loading Please Wait", true, true,
                            new DialogInterface.OnCancelListener() {
    
                                @Override
                                public void onCancel(DialogInterface dialog) {
                                    // do something
                                }
                            });
    
                loadingDialog.setCancelable(false);
            }
    
    
            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request,
                                        WebResourceError error) {
    
    
                if (isConnected()) {
                    final Snackbar snackBar = Snackbar.make(rootView, "onReceivedError : " + error.getDescription(), Snackbar.LENGTH_INDEFINITE);
                    snackBar.setAction("Reload", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            webView.loadUrl("javascript:window.location.reload( true )");
                        }
                    });
                    snackBar.show();
                } else {
                    final Snackbar snackBar = Snackbar.make(rootView, "No Internet Connection ", Snackbar.LENGTH_INDEFINITE);
                    snackBar.setAction("Enable Data", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            startActivityForResult(new Intent(Settings.ACTION_WIRELESS_SETTINGS), 0);
                            webView.loadUrl("javascript:window.location.reload( true )");
                            snackBar.dismiss();
                        }
                    });
                    snackBar.show();
                }
    
                super.onReceivedError(view, request, error);
    
            }
    
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onReceivedHttpError(WebView view,
                                            WebResourceRequest request, WebResourceResponse errorResponse) {
    
                if (isConnected()) {
                    final Snackbar snackBar = Snackbar.make(rootView, "HttpError : " + errorResponse.getReasonPhrase(), Snackbar.LENGTH_INDEFINITE);
    
                    snackBar.setAction("Reload", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            webView.loadUrl("javascript:window.location.reload( true )");
                        }
                    });
                    snackBar.show();
                } else {
                    final Snackbar snackBar = Snackbar.make(rootView, "No Internet Connection ", Snackbar.LENGTH_INDEFINITE);
                    snackBar.setAction("Enable Data", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            startActivityForResult(new Intent(Settings.ACTION_WIRELESS_SETTINGS), 0);
                            webView.loadUrl("javascript:window.location.reload( true )");
                            snackBar.dismiss();
                        }
                    });
                    snackBar.show();
                }
                super.onReceivedHttpError(view, request, errorResponse);
            }
    
            @Override
            public void onPageFinished(WebView view, String url) {
    
                if (webViewPreviousState == PAGE_STARTED) {
    
                    if (null != loadingDialog) {
                        loadingDialog.dismiss();
                        loadingDialog = null;
                    }
                }
            }
        }
    

    isConnected方法用于检查网络连接

    /**
     * Check if there is any connectivity
     *
     * @return is Device Connected
     */
    public boolean isConnected() {
    
        ConnectivityManager cm = (ConnectivityManager)
                this.getSystemService(Context.CONNECTIVITY_SERVICE);
    
        if (null != cm) {
            NetworkInfo info = cm.getActiveNetworkInfo();
            return (info != null && info.isConnected());
        }
    
        return false;
    
    }
    

    如您所见,我添加了一个过滤器来检查以showalert: 开头的 URL。如果我的 Web 客户端类捕获到任何以 showalert 开头的 URL,那么它会触发 handleAlert 方法。

    结果

    【讨论】:

    • 谢谢@HiteshSahu先生,我在这里使用SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);而不是PreferenceManager你能用我共享的首选项名称更新你的答案吗,因为我已经以不同的方式将它用于某些活动实际上它需要将文件保存在 saredprefs 中的MyPrefsFile1.xml 中,但现在将其保存为 my.example.webv_prefernce.xml 请帮助我解决此问题...您的答案有效,但我需要为 diff 选项分配相同的值.. 所以我已经添加了如果它的错误打开活动与警报其他打开活动.. 但需要共享首选项文件
    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2019-08-24
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多