web-dev-qa-db-fra.com

comment déclencher un événement lorsque quelqu'un clique n'importe où sur l'écran d'une application Android?

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?

23
gurehbgui

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) {

    }

 });
25
Samir Mangroliya

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 EditTexts 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.

5
Genia S.

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

2
Andrey Busik

Donnez à votre mise en page principale un identifiant, puis

LinearLayout root = (LinearLayout) findViewById(R.id.main_layout);
root.setOnClickListener(new OnClickListener() {
    public void onClick()
    {

    }
});
1
Manitoba

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 :)

0
Antzi

Peut-être pouvez-vous ajouter un écouteur à l’instance Layout, obtenir la disposition avec 

RelativeLayout l = (RelativeLayout)findViewById(R.id.mylayout);
l.setOnClickListener(click);
0
DGomez