Comment supprimer le dialog en cliquant sur en dehors de la boîte de dialog?

J’ai implémenté une boîte de dialog personnalisée pour mon application. Je veux implémenter que lorsque l’utilisateur clique en dehors de la boîte de dialog, la boîte de dialog sera rejetée. Que dois-je faire pour cela?

Vous pouvez utiliser dialog.setCanceledOnTouchOutside(true); qui fermera la boîte de dialog si vous touchez en dehors de la boîte de dialog.

Quelque chose comme,

  Dialog dialog = new Dialog(context) dialog.setCanceledOnTouchOutside(true); 

Ou si votre dialog dans non-modèle alors,

1 – Définir l’ FLAG_NOT_TOUCH_MODAL pour l’atsortingbut de fenêtre de votre boîte de dialog

 Window window = this.getWindow(); window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 

2 – Ajouter un autre indicateur aux propriétés de Windows, FLAG_WATCH_OUTSIDE_TOUCH – celui-ci est destiné à la boîte de dialog pour recevoir des événements tactiles en dehors de sa région visible.

3 – Remplacez onTouchEvent() de la boîte de dialog et vérifiez le type d’action. Si le type d’action est ‘ MotionEvent.ACTION_OUTSIDE ‘, l’utilisateur interagit en dehors de la zone de dialog. Donc, dans ce cas, vous pouvez réduire votre dialog ou décider de ce que vous voulez faire. voir plainprint

 public boolean onTouchEvent(MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_OUTSIDE){ System.out.println("TOuch outside the dialog ******************** "); this.dismiss(); } return false; } 

Pour plus d’informations, reportez-vous à la section Comment supprimer une boîte de dialog personnalisée basée sur des points de contact? et comment ignorer votre boîte de dialog non modale lorsque vous touchez une zone de dialog externe

Vous pouvez utiliser cette implémentation de onTouchEvent. Cela évite de réagir sous l’activité à l’événement tactile (comme mentionné dans les Howettl).

 @Override public boolean onTouchEvent ( MotionEvent event ) { // I only care if the event is an UP action if ( event.getAction () == MotionEvent.ACTION_UP ) { // create a rect for storing the window rect Rect r = new Rect ( 0, 0, 0, 0 ); // resortingeve the windows rect this.getWindow ().getDecorView ().getHitRect ( r ); // check if the event position is inside the window rect boolean intersects = r.contains ( (int) event.getX (), (int) event.getY () ); // if the event is not inside then we can close the activity if ( !intersects ) { // close the activity this.finish (); // notify that we consumed this event return true; } } // let the system handle the event return super.onTouchEvent ( event ); } 

Source: http://blog.twimager.com/2010/08/closing-activity-by-touching-outside.html

Utilisez simplement

 dialog.setCanceledOnTouchOutside(true); 

Ou, si vous personnalisez la boîte de dialog en utilisant un thème défini dans votre style xml, insérez cette ligne dans votre thème:

 true 
 dialog.setCanceledOnTouchOutside(true); 

fermer le dialog sur le toucher à l’extérieur.

Et si vous ne voulez pas fermer le contact à l’extérieur, utilisez le code ci-dessous:

 dialog.setCanceledOnTouchOutside(false); 

Cette méthode devrait éviter complètement les activités sous la zone grise en récupérant les événements de clic.

Supprimez cette ligne si vous l’avez:

 window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 

Mettez ceci sur votre activité créée

 getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); 

puis passer outre l’événement tactile avec cette

 @Override public boolean onTouchEvent(MotionEvent ev) { if(MotionEvent.ACTION_DOWN == ev.getAction()) { Rect dialogBounds = new Rect(); getWindow().getDecorView().getHitRect(dialogBounds); if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) { // You have clicked the grey area displayYourDialog(); return false; // stop activity closing } } // Touch events inside are fine. return super.onTouchEvent(ev); } 

Vous pouvez essayer ceci: –

 AlterDialog alterdialog; alertDialog.setCanceledOnTouchOutside(true); 

ou

 alertDialog.setCancelable(true); 

Et si vous avez un AlterDialog.Builder Alors vous pouvez essayer ceci: –

 alertDialogBuilder.setCancelable(true); 

Une autre solution, ce code a été coupé du code source Android de Window Vous devez simplement append cette deux méthodes à votre code source de dialog.

 @Override public boolean onTouchEvent(MotionEvent event) { if (isShowing() && (event.getAction() == MotionEvent.ACTION_DOWN && isOutOfBounds(getContext(), event) && getWindow().peekDecorView() != null)) { hide(); } return false; } private boolean isOutOfBounds(Context context, MotionEvent event) { final int x = (int) event.getX(); final int y = (int) event.getY(); final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop(); final View decorView = getWindow().getDecorView(); return (x < -slop) || (y < -slop) || (x > (decorView.getWidth()+slop)) || (y > (decorView.getHeight()+slop)); } 

Cette solution n’a pas ce problème:

Cela fonctionne très bien sauf que l’activité en dessous réagit également à l’événement tactile. Y a-t-il un moyen d’empêcher cela? – Howettl

Ce code est utilisé lorsque vous cliquez sur la boîte de dialog à l’heure à laquelle vous avez saisi et lorsque l’utilisateur clique sur le côté externe de la boîte de dialog, cette fois-ci, les entrées et les boîtes de dialog sont proches.

 dialog = new Dialog(act) { @Override public boolean onTouchEvent(MotionEvent event) { // Tap anywhere to close dialog. Rect dialogBounds = new Rect(); getWindow().getDecorView().getHitRect(dialogBounds); if (!dialogBounds.contains((int) event.getX(), (int) event.getY())) { // You have clicked the grey area InputMethodManager inputMethodManager = (InputMethodManager) act .getSystemService(act.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(dialog .getCurrentFocus().getWindowToken(), 0); dialog.dismiss(); // stop activity closing } else { InputMethodManager inputMethodManager = (InputMethodManager) act .getSystemService(act.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(dialog .getCurrentFocus().getWindowToken(), 0); } return true; } }; 

Vous pouvez rendre un backgroundbackground occupant toute la taille de l’écran transparent et écouter l’événement onClick pour le onClick .

Appelez dialog.setCancelable(false); de votre activité / fragment.