2017-04-15 1 views
1

Ich habe eine Web-Ansicht In diesem auf Klick mit der Hilfe JavaScript-Schnittstelle wird es geöffnet Meine Android-Aktivitäten ist aus der Web-Ansicht Hier funktioniert es gut ...Android Alert mit "Nicht wieder anzeigen" -Kontrollkästchen in Webview

So Hier wenn Benutzer klicken sie auf eine Schaltfläche Welche JS-Interface ist .. ich habe auf sie einen Alarm

Also, wenn überhaupt Benutzer Klick hinzugefügt ... es wird ein Dialog ...

Now I gefolgt this, um eine Option hinzuzufügen, wie nicht erneut fragen .... Kontrollkästchen

Hier habe ich Geteilte Prefs und Checkbox ... Aber es funktioniert nicht ...

und eine weitere Sache, die Kontrollkästchen in Web-Ansicht ist ... es sollte nur in Alarm angezeigt werden .. Aber es ist zeigt alle Zeit ...

Kann mir vorschlagen .. Wie Alarm mit Kontrollkästchen, um .. nicht wieder fragen in android Webview ... und das Kontrollkästchen erinnern ...

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

Aktualisieren

Hier ist my code dafür habe ich die example code ... bei alarm ...

Eigentlich brauche ich ein Kontrollkästchen ohne XML für Checkbox ... (Wegen XML für das Kontrollkästchen meine Main-Web-Ansicht erhält einige Fehler) Ist es möglich .. wenn Lassen sie uns so kennen ...

Antwort

2

ich Ihr Problem in 2 Teile brechen werde

1) Anzeige Dialog und denken sie daran, wenn der Benutzer gewählt hat, um es nicht wieder zu zeigen

Ein einfacher Alarmdialog mit gemeinsamen Einstellungen ca n mach das.

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) Auslöser diese Methode aus JavaScript.

shouldOverrideUrlLoading(WebView view, String url) ist veraltet nach Android N zeigen, dass Sie auch shouldOverrideUrlLoading(WebView view, WebResourceRequest request) überschreiben müssen.

Eine vollständige WebViewClient-Klasse wird wie folgt aussehen.

/** 
    * 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 Methode wird verwendet, Netzwerkverbindung

/** 
* 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; 

} 

zu überprüfen, wie Sie habe ich einen Filter sehen überprüfen URL mit showalert: starten hinzugefügt. Wenn meine Webclient-Klasse eine URL abfängt, die mit showalert beginnt, löst sie die Methode handleAlert aus.

Ergebnis

enter image description here

2) Auslöser diese Methode aus JavaScript.

shouldOverrideUrlLoading(WebView view, String url) ist veraltet nach Android N zeigen, dass Sie auch shouldOverrideUrlLoading(WebView view, WebResourceRequest request) überschreiben müssen.

Eine vollständige WebViewClient-Klasse wird wie folgt aussehen.

/** 
    * 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 Methode wird verwendet, Netzwerkverbindung

/** 
* 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; 

} 

zu überprüfen, wie Sie habe ich einen Filter sehen überprüfen URL mit showalert: starten hinzugefügt. Wenn meine Webclient-Klasse eine URL abfängt, die mit showalert beginnt, löst sie die Methode handleAlert aus.

Ergebnis

enter image description here

+0

Dank @HiteshSahu Herr, hier ist 'SharedPreferences Einstellungen verwenden = getSharedPreferences (PREFS_NAME, 0);' statt 'PreferenceManager' können Sie bitte Ihre Antwort mit meinem gemeinsamen aktualisieren Prefs Name, weil ich dies zu einigen der Aktivitäten in einer anderen Weise tatsächlich gegeben habe, muss es Datei in 'MyPrefsFile1.xml' in saredprefs speichern, aber jetzt speichert es als my.example.webv_prefernce.xml bitte helfen Sie mir auf ... Ihre Antwort funktioniert, aber ich muss den diff-Optionen den gleichen Wert zuweisen. Also habe ich hinzugefügt, wenn die falsche offene Aktivität mit der Warnung else open activ geöffnet wird ity .. aber benötigen gemeinsame Prefs-Datei –

+0

aktualisierte Antwort. –

Verwandte Themen