Comme @pcans l'a suggéré, vous pouvez le faire en surchargeant dispatchTouchEvent(MotionEvent event)
dans votre activité.
Nous obtenons ici les coordonnées du toucher et les comparons aux limites de la vue. Si le toucher est effectué en dehors d'une vue, il faut faire quelque chose.
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
View yourView = (View) findViewById(R.id.view_id);
if (yourView != null && yourView.getVisibility() == View.VISIBLE) {
// touch coordinates
int touchX = (int) event.getX();
int touchY = (int) event.getY();
// get your view coordinates
final int[] viewLocation = new int[2];
yourView.getLocationOnScreen(viewLocation);
// The left coordinate of the view
int viewX1 = viewLocation[0];
// The right coordinate of the view
int viewX2 = viewLocation[0] + yourView.getWidth();
// The top coordinate of the view
int viewY1 = viewLocation[1];
// The bottom coordinate of the view
int viewY2 = viewLocation[1] + yourView.getHeight();
if (!((touchX >= viewX1 && touchX <= viewX2) && (touchY >= viewY1 && touchY <= viewY2))) {
Do what you want...
// If you don't want allow touch outside (for example, only hide keyboard or dismiss popup)
return false;
}
}
}
return super.dispatchTouchEvent(event);
}
Il n'est pas non plus nécessaire de vérifier l'existence et la visibilité des vues si la disposition de votre activité ne change pas au cours de l'exécution (par exemple, vous n'ajoutez pas de fragments ou ne remplacez/supprimez pas de vues de la disposition). Mais si vous voulez fermer (ou faire quelque chose de similaire) le menu contextuel personnalisé (comme dans le Google Play Store lorsque vous utilisez le menu de débordement de l'élément), il est nécessaire de vérifier l'existence de la vue. Sinon, vous obtiendrez un NullPointerException
.