Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to cancel an Dialog themed like Activity when touched outside the window?

I have an activity with a Dialog theme and I would like to close (finish) this activity when someone touches the screen anywhere outside this activity's window ? How can I do this ?

like image 255
Alex Avatar asked Jan 10 '11 18:01

Alex


People also ask

How do you dismiss dialog with click on outside of dialog?

You can use dialog. setCanceledOnTouchOutside(true); which will close the dialog if you touch outside of the dialog.

How do I stop dialog close on click outside Android?

Simply, alertDialog. setCancelable(false); prevent user from click outside of Dialog Box.


2 Answers

Just to point out that there is a way to get dialog-like "touch outside to cancel" behaviour from an Activity themed as a dialog, though I've not fully investigated whether it has unwanted side effects.

Within your Activity's onCreate() method, before creating the view, you're going to set two flags on the window: One to make it 'non-modal', to allow views other than your activity's views to receive events. The second is to receive notification that one of those events has taken place, which will send you an ACTION_OUTSDIE move event.

If you set the theme on the activity to the dialog theme, you'll get the behaviour you want.

It looks something like this:

public class MyActivity extends Activity {   @Override   protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);      // Make us non-modal, so that others can receive touch events.     getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL);      // ...but notify us that it happened.     getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);      // Note that flag changes must happen *before* the content view is set.     setContentView(R.layout.my_dialog_view);   }    @Override   public boolean onTouchEvent(MotionEvent event) {     // If we've received a touch notification that the user has touched     // outside the app, finish the activity.     if (MotionEvent.ACTION_OUTSIDE == event.getAction()) {       finish();       return true;     }      // Delegate everything else to Activity.     return super.onTouchEvent(event);   } } 
like image 120
Gregory Block Avatar answered Sep 23 '22 06:09

Gregory Block


I found an even simpler answer that has worked perfectly for me. If you're using an activity with the dialog theme then you can apply this.setFinishOnTouchOutside(true); to the activity's onCreate() method.

@Override protected void onCreate(Bundle savedInstanceState)  {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_yoptions);     this.setFinishOnTouchOutside(true); } 
like image 20
vabanagas Avatar answered Sep 21 '22 06:09

vabanagas