2012-08-24 7 views
142

Ho un'attività che utilizza lo stile Theme.Dialog in modo che sia una finestra mobile su un'altra attività. Tuttavia, quando faccio clic all'esterno della finestra di dialogo (sull'attività in background), la finestra di dialogo si chiude. Come posso fermare questo comportamento?Previene la chiusura della finestra di attività di Android dal tocco esterno

+1

Perché dovresti farlo. SE il comportamento che vuoi è di una finestra di dialogo, perché non usare una finestra di dialogo? Venendo alla tua domanda, non penso che ci sia una soluzione a questo. –

+0

Le finestre di dialogo di KumarBibek sono limitate quando si tratta di personalizzazioni del layout ... ecco perché un'attività. Anche i documenti dello sviluppatore raccomandano questo approccio per una personalizzazione flessibile – Leo

+0

E ciò che l'OP desidera è una finestra di dialogo ** Modale **, ovvero una finestra di dialogo che obbliga l'utente a rispondere, come OK o Sì/No. L'utente non dovrebbe essere in grado di fare solo clic. –

risposta

25

Questo potrebbe aiutarti. E 'un modo per gestire l'evento al di fuori tatto:

How to cancel an Dialog themed like Activity when touched outside the window?

Catturando l'evento e non fare nulla, penso che si può impedire la chiusura. Ma ciò che è strano, però, è che il comportamento predefinito della finestra di dialogo attività dovrebbe essere non chiudersi quando si tocca all'esterno.

(PS: il codice utilizza WindowManager.LayoutParams)

+1

L'oggetto non è una finestra di dialogo, è un'attività che utilizza lo stile di dialogo. L'attività non ha questo metodo e non può essere trasmessa a Dialog. – Fergusmac

+0

Ok, scusami ho frainteso, correggerò presto la mia risposta –

+0

Ho modificato per aggiungere quello che ho trovato che potrebbe aiutarti –

99

Cosa hai in realta 'è un'attività (anche se sembra una finestra di dialogo), quindi si dovrebbe chiamare setFinishOnTouchOutside(false) dalla vostra attività, se si desidera tenerlo aperto quando si fa clic sull'attività in background.

EDIT: Questo funziona solo con livello di API Android 11 o superiore

+3

Ciò non impedisce di premere il pulsante "indietro" nella tua attività. Quindi è necessario sovrascrivere 'onBackPressed()' non facendo nulla nel suo corpo –

+0

Non impedisce il pulsante "indietro" in quella finestra di dialogo Attività senza onBackPressed(). Funziona perfettamente con this.setFinishOnTouchOutside (false). – Kunalxigxag

+0

funziona bene grazie –

22

Quello che ha funzionato per me è stato quello di creare un set dialogFragment a non essere annullabile:

dialog.setCancelable (false);

+1

Non utile. Questa domanda riguarda le attività, non i dialoghi. –

275

Per evitare che la finestra di dialogo di ottenere respinto sulla schiena uso tasto premuto questo

dialog.setCancelable(false); 

E per evitare che la finestra di dialogo di ottenere respinto il tocco esterno utilizzare questo

dialog.setCanceledOnTouchOutside(false); 
+4

Questa risposta è utile ma questa domanda riguarda l'attività utilizzando l'attributo Theme.Dialog. –

+7

So quando mi rendo conto che è troppo tardi poiché aiuta molte persone a non eliminarlo. – Singhak

+6

So che questo non riguarda veramente la domanda, ma questo mi ha aiutato. Grazie! – dennisdrew

1

stavo affrontando lo stesso problema. Per gestirlo ho impostato un OntouchListener nella finestra di dialogo e non ho fatto nulla all'interno. Ma la finestra di dialogo si disattiva anche ruotando lo schermo. Per risolvere il problema ho impostato una variabile per dirmi se la finestra di dialogo è stata normalmente ignorata. Quindi ho impostato un OnDismissListener nella mia finestra di dialogo e all'interno ho controllato la variabile. Se la finestra di dialogo non funziona normalmente, non faccio niente, altrimenti eseguo nuovamente la finestra di dialogo (e impostando il suo stato come quando si chiude nel mio caso).

14

Per API 10 superiore, la finestra di dialogo scompare quando viene toccato all'esterno, mentre in basso rispetto all'API 11, la finestra di dialogo non scompare. Per evitare questo, è necessario fare:

In styles.xml: <item name="android:windowCloseOnTouchOutside">false</item>

O

In onCreate() metodo, utilizzare: this.setFinishOnTouchOutside(false);

Nota: per API 10 e più bassa, questo metodo doesn' ha effetto e non è necessario

+0

Esattamente quello che stavo cercando. Grazie! – masterwok

4

Usa setFinishOnTouchOutside(false) per API> 11 e non ti preoccupare perché il comportamento predefinito di suo Android quella finestra di attività a tema non verrà finito sul tocco esterno per API < 11 :) !! Cheerss !!

5

Lo uso in onCreate(), sembra funzionare su qualsiasi versione di Android; testato su 5.0 e 4.4.x, non può provare su Gingerbread, dispositivi Samsung (Nota 1 corsa GB) hanno in questo modo per impostazione predefinita:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
    { 
     setFinishOnTouchOutside(false); 
    } 
    else 
    { 
     getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); 
    } 

    super.onCreate(savedInstanceState); 
6
Dialog dialog = new Dialog(context) 
dialog.setCanceledOnTouchOutside(true); //use this to dismiss the dialog on outside click of dialog 

dialog.setCanceledOnTouchOutside(false); //use this for not to dismiss the dialog on outside click of dialog. 

Guarda questo link per maggiori informazioni su dialog.

dialog.setCancelable(false);//used to prevent the dismiss of dialog on backpress of that activity 

dialog.setCancelable(true);//used to dismiss teh dialog on onbackpressed of that activity 
+0

Si noti che la domanda riguarda le attività utilizzate come finestre di dialogo, NON la classe di dialogo. –

+1

nice ... very nice ... bella risposta: P –

3
 alert.setCancelable(false); 
     alert.setCanceledOnTouchOutside(false); 

Immagino che questo ti possa aiutare. Ha funzionato per me

+1

Si prega di provare anche a spiegare perché questo funzionerà ... Solo un dump del codice non è una buona risposta. – Codebender

0

Inoltre è possibile assegnare azioni diverse in plementing onCancelListener:

alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){     
    @Override 
    public void onCancel(DialogInterface dialogInterface) { 
     //Your custom logic 
    } 
}); 
+0

Come posso identificare se l'annullamento viene chiamato a causa del tocco fuori dalla finestra di avviso? – cegprakash

10

Impostazione della finestra di dialogo cancelable false è sufficiente, e né si tocca al di fuori della finestra di avviso o fare clic sul pulsante Indietro farà le finestra di dialogo di avviso scompaiono. Quindi, utilizzare questo:

setCancelable(false)

E l'altra funzione non è più necessario: dialog.setCanceledOnTouchOutside(false);

Se si sta creando una finestra temporanea e chiedendo lì a mettere questa riga di codice, ecco un esempio :

new AlertDialog.Builder(this) 
         .setTitle("Trial Version") 
         .setCancelable(false) 
         .setMessage("You are using trial version!") 
         .setIcon(R.drawable.time_left) 
         .setPositiveButton(android.R.string.yes, null).show(); 
11

utilizzare questo codice sta funzionando per me

AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); 
alertDialog.setCancelable(false); 

+0

sì, questo sta funzionando bene per me. – Kogile

+0

questa dovrebbe essere la risposta corretta, se potesse fare la domanda corretta! – alijunior

+1

Questa sarebbe la risposta corretta, se l'OP chiedeva informazioni su * dialoghi *! Ma la domanda riguarda le attività - un caso abbastanza diverso. –

3

Ecco la mia soluzione:

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setTitle("Select The Difficulty Level"); 
builder.setCancelable(false); 
1

builder.setCancelable (false);


public void Messaggio (Visualizza v) {

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle("¿Quieres ir a el Menú principal?"); 
    builder.setMessage("Al presionar SI iras a el menú y saldras de la materia."); 
    builder.setPositiveButton("SI", null); 
    builder.setNegativeButton("NO", null); 
    builder.setCancelable(false); 
    builder.show(); 
} 
+1

Ciao Alex. Benvenuto su StackOverflow e grazie per la tua risposta. Potresti modificare la tua risposta per descrivere cosa fa il tuo codice e come questo risolve il problema dell'OP? Le risposte al solo codice sono scoraggiate in quanto non insegnano o spiegano il _why_. Grazie! –

6

Quando si utilizza dialogo come attività nella onCreate aggiungere questa

setFinishOnTouchOutside(false); 
6

Semplicemente,

alertDialog.setCancelable(false); 

prevenire utente dal clic all'esterno della finestra di dialogo.

Problemi correlati