Tocca fuori dalla window di dialogo Android per licenziarlo?

Mi stavo chiedendo se è ansible toccare in qualche modo fuori di una window di dialogo popup (o un'attività con un tema di dialogo), e disattenderlo semplicemente toccando fuori di esso?

Ho fatto un quadro rapido per illustrarlo:

  • Invio e ricezione di IQ personalizzati XMPP con aSmack su Android
  • Attività Android SDK Call WebView
  • Come submit file dal dispositivo Android a un altro dispositivo tramite Bluetooth per codice
  • Come creare applicazioni di sistema in android
  • migliorare le performance di Tesseract con OpenCV su Android
  • Mostra ProgressDialog nella class Fragment
  • immettere qui la descrizione dell'immagine

    Normalmente, è necessario premere il tasto indietro per ignorare le windows di dialogo, ma su Honeycomb potrebbe essere ottimo avere la possibilità di toccare appena fuori dalla window di dialogo, a causa di tutta la properties; dello schermo.

  • applicazione di sicurezza per bambini sul android
  • bersaglio del button del menu a nido d'ape android
  • Il PreferenceFragment è stato intenzionalmente escluso dal pacchetto di compatibilità?
  • android - Come impostare il layout personalizzato per PreferenceActivity in Android 3.0?
  • Come posso get la width e l'altezza dello schermo del sistema Honeycomb di android?
  • Come l'applicazione Android decida se vogliono utilizzare il proxy di networking o less
  • 12 Solutions collect form web for “Tocca fuori dalla window di dialogo Android per licenziarlo?”

    La mia applicazione è una singola attività con Theme.Holo.Dialog. Nel mio caso l'altra risposta non funzionava. Ha fatto solo le altre applicazioni di background o la schermata di avvio per ricevere events touch.

    Ho scoperto che l'utilizzo di dispatchTouchEvent funziona nel mio caso. Penso che sia anche una soluzione più semplice. Di seguito è riportto un codice di esempio su come utilizzarlo per rilevare i rubinetti all'esterno dell'attività con un tema di dialogo:

    @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); } 
     dialog.setCanceledOnTouchOutside(true) 

    Consente di impostare se questa window di dialogo viene annullata quando viene toccato al di fuori dei limiti della window.

    Esiste un metodo TouchInterceptor che verrà richiamato quando si tocca il lato della window popup

    Per esempio

     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 è la window popup

    Se desideri la stessa funzionalità per l'Attività, devi seguire i passi sotto.

    1) Aggiungere la bandiera prima del metodo setContentView() chiamato in 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) Sovrascrivi evento onTouchEvent() in Attività

    e scrivere sotto il codice

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

    La copia completa è qui

    Attività

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

    Questo è 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> 

    È ansible utilizzare l' attività # setFinishOnTouchOutside anche se la window di dialogo è un'attività. Questo deve essere il modo più breve per l' Activity s;)

    (È API 11+, ma API <= 10 è generalmente normale.)

    È ansible utilizzare

      dialog.setCancelable(true\false); 

    Per le veszioni più recenti di Android;

    Distriggers l'evento outSideTouching.

    Semplicemente scrivo dialog.setCanceledOnTouchOutside (falso); e funziona per me, la window non si spegnerà sul rubinetto esterno.

      dialog = new Dialog(MainActivity.this); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.dialog_layout); dialog.getWindow().setBackgroundDrawableResource( android.R.color.transparent); dialog.setCancelable(false); dialog.setCanceledOnTouchOutside(true); 

    Controlla se hai questa linea di codice o no ….

      dialog.setCanceledOnTouchOutside(true); 

    Vecchia domanda ma un'altra soluzione:

    1. Rendere la tua attività in primo piano a schermo integer. Layout usenested: il layout a tutto schermo dovrebbe avere uno background trasparente (ad esempio @null o @android:color/transparent ). Il layout interno dovrebbe avere uno background visibile.

    2. Aggiungere un OnClickListener al layout esterno invisibile che finish() tua attività.

    Utilizza stile di dialogo piuttosto che altri stili.

    Ad esempio, Utilizza

     public YourCustomDialog(Context context) { super(context, android.R.style.Theme_Holo_dialog_NoActionBar); } 

    Quando si utilizzano altri stili come Theme_Translucent_NoTitleBar , la window di dialogo non verrà eliminata .

     LayoutParams lp=dialogp.getWindow().getAttributes(); lp.flags=LayoutParams.FLAG_LAYOUT_NO_LIMITS; 

    Ho aggiunto questo e funziona perfettamente su 3.0, ma dovrebbe funzionare su tutti.

    this.setFinishOnTouchOutside (false);

    puoi utilizzare questo

    Qualsiasi vista all'interno della window di dialogo può essere impostata per consumare l'evento di contatto in modo che sotto non venga chiamato.

     onCreate(){ getWindow().getDecorView().getRootView().setOnTouchListener(new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { dialog.dismiss(); return false; } }); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.