comment puis-je attraper l'événement lorsque des clics se produisent quelque part sur l'écran de l'application? Peu importe qu'il y ait un bouton ou autre chose. Je dois juste appliquer un écouteur d'événement onClick()
sur tout l'écran de l'application .
Comment faire cela?
setonclicklistner
pour la disposition principale de votre fichier de disposition ....
Comme .... main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:ads="http://schemas.Android.com/apk/lib/com.google.ads"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:id="@+id/mainlayout">
<!- Your other view->
</Relativelayout>
et définir un écouteur de clic pour mainlayout ...
RelativeLayout rlayout = (RelativeLayout) findViewById(R.id.mainlayout);
rlayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
Je crois que le moyen le plus simple est de remplacer onUserInteraction dans votre Activity
Sachez simplement que cela ne se déclenche pas lorsque les utilisateurs se concentrent sur EditText
s et Spinners
(probablement d'autres widgets également). Mais il se déclenche chaque fois que l'utilisateur touche l'écran ou appuie sur un bouton.
Mais cela rend inutile la création d'auditeurs dans vos mises en page ou l'écriture de méthodes supplémentaires pour les gérer. Je pense donc que c'est le moyen le plus simple d'obtenir ce que vous voulez.
Vous devriez simplement écraser la méthode Activity
's dispatchTouchEvent(ev: MotionEvent)
Regardez cet exemple à Kotlin. Cette approche n’affectera aucun onClickListenters dans votre application
/**
* On each touch event:
* Check is [snackbar] present and displayed
* and dismiss it if user touched anywhere outside it's bounds
*/
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
// dismiss shown snackbar if user tapped anywhere outside snackbar
snackbar?.takeIf { it.isShown }?.run {
val touchPoint = Point(Math.round(ev.rawX), Math.round(ev.rawY))
if (!isPointInsideViewBounds(view, touchPoint)) {
dismiss()
snackbar = null // set snackbar to null to prevent this block being executed twice
}
}
// call super
return super.dispatchTouchEvent(ev)
}
Ou consultez le complet Gist
Donnez à votre mise en page principale un identifiant, puis
LinearLayout root = (LinearLayout) findViewById(R.id.main_layout);
root.setOnClickListener(new OnClickListener() {
public void onClick()
{
}
});
Vous pouvez également définir directement un rappel à partir de l'attribut onClick
xml de la présentation racine:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:ads="http://schemas.Android.com/apk/lib/com.google.ads"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:onClick"myMethod">
<!- Your other view->
</Relativelayout>
Et dans votre activité:
public void myMethod(View pView) {
//XXX do something
}
Code moins gonflé de cette façon :)
Peut-être pouvez-vous ajouter un écouteur à l’instance Layout, obtenir la disposition avec
RelativeLayout l = (RelativeLayout)findViewById(R.id.mylayout);
l.setOnClickListener(click);