38 votes

Appuyez en dehors de la boîte de dialogue Android pour la rejeter

Je me demandais s'il était possible de cliquer d'une manière ou d'une autre en dehors d'une boîte de dialogue contextuelle (ou d'une activité avec un thème de boîte de dialogue) et de la rejeter en appuyant simplement en dehors de celle-ci?

J'ai fait une photo rapide pour l'illustrer:

entrez la description de l'image ici

Normalement, vous devez appuyer sur la touche Retour pour fermer les boîtes de dialogue, mais sous Honeycomb, il pourrait être intéressant de pouvoir taper en dehors de la boîte de dialogue, en raison de la totalité de l'écran.

90voto

Francesco Vadicamo Points 2867
 dialog.setCanceledOnTouchOutside(true) 
 

Définit si cette boîte de dialogue est annulée lorsqu'elle est touchée en dehors des limites de la fenêtre.

47voto

Jan S. Points 4905

Mon application est une seule et même activité avec le Thème.Holo.La boîte de dialogue. Dans mon cas, la réponse n'a pas fonctionné. Il était tout à fait le fond d'autres applications ou l'écran de lancement pour recevoir les événements tactiles.

J'ai trouvé que l'utilisation de dispatchTouchEvent fonctionne dans mon cas. Je pense que c'est aussi une solution plus simple. Voici un exemple de code sur la façon de l'utiliser pour détecter les robinets à l'extérieur de l'activité avec une boîte de Dialogue thème:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    Rect dialogBounds = new Rect();
    getWindow().getDecorView().getHitRect(dialogBounds);

    if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
        // Tapped outside so we finish the activity
        this.finish();
    }
    return super.dispatchTouchEvent(ev);
}

14voto

Dharmendra Points 14394

Il y a un TouchInterceptor méthode qui sera appelée lorsque vous appuyez sur le côté de la fenêtre popup

Par exemple

mWindow.setTouchInterceptor(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                    mWindow.dismiss();

                    return true;
                }

                return false;
            }
        });

mWindow est la fenêtre pop-up

Et si vous voulez les mêmes fonctionnalités pour les Activités, vous devez suivre les étapes ci-dessous.

1) Ajouter un drapeau avant d' setContentView() méthode appelée en onCreate();

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

2) Remplacer onTouchEvent() événement en Activité

et écrire le code ci-dessous

 @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                Toast.makeText(getApplicationContext(), "Finish", 3000).show();
                finish();               
                return true;
            }
            return false;
        }

La copie complète est ici

L'activité

package net.londatiga.android;

import android.app.Activity;
import android.os.Bundle;

import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager.LayoutParams;

import android.widget.Button;
import android.widget.Toast;

public class NewQuickAction3DActivity extends Activity implements OnTouchListener {

    @Override
    public 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);

        setContentView(R.layout.main);

    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
            Toast.makeText(getApplicationContext(), "Hi", 3000).show();

            return true;
        }

        return false;
    }
}

C'est manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="net.londatiga.android"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".NewQuickAction3DActivity"
                  android:label="@string/app_name" android:theme="@android:style/Theme.Holo.Dialog">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

5voto

nmr Points 5504

Vous pouvez aussi utiliser l' activité # setFinishOnTouchOutside , si votre dialogue est un Activity . Cela doit être le chemin le plus court pour Activity s;)

(C'est l'API 11+ cependant. Mais l'API <= 10 est généralement de taille d'écran normale.)

5voto

Amt87 Points 872

Vous pouvez utiliser

   dialog.setCancelable(true\false); 
 

Pour les dernières vesrions d'Android;

Cela désactivera l'événement outSideTouching.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X