Mam działanie, które korzysta ze stylu Theme.Dialog, dzięki czemu jest to ruchome okno nad innym działaniem. Jednak gdy kliknę poza oknem dialogowym (w tle), okno dialogowe zostanie zamknięte. Jak mogę zatrzymać to zachowanie?
Mam działanie, które korzysta ze stylu Theme.Dialog, dzięki czemu jest to ruchome okno nad innym działaniem. Jednak gdy kliknę poza oknem dialogowym (w tle), okno dialogowe zostanie zamknięte. Jak mogę zatrzymać to zachowanie?
Odpowiedzi:
To może ci pomóc. Jest to sposób na obsługę dotyku zdarzenia zewnętrznego:
Jak anulować okno dialogowe takie jak Aktywność po dotknięciu za oknem?
Chwytając zdarzenie i nie robiąc nic, myślę, że możesz zapobiec zamknięciu. Dziwne jest jednak to, że domyślnym zachowaniem okna dialogowego aktywności nie powinno być zamykanie się po dotknięciu na zewnątrz.
(PS: kod używa WindowManager.LayoutParams)
Aby zapobiec odrzuceniu okna dialogowego po naciśnięciu klawisza Wstecz, użyj tego
dialog.setCancelable(false);
Aby uniknąć odrzucenia okna dialogowego przy użyciu dotyku zewnętrznego, użyj tego
dialog.setCanceledOnTouchOutside(false);
AlertDialog
zamknięciu standardu za pomocą dotyku na zewnątrz, i to właśnie zapewnia ta odpowiedź.
setCancelable(false)
To, co faktycznie masz, to Działanie (nawet jeśli wygląda jak okno dialogowe), dlatego powinieneś zadzwonić setFinishOnTouchOutside(false)
z tego działania, jeśli chcesz, aby było otwarte po kliknięciu działania w tle.
EDYCJA: Działa to tylko z Androidem API poziomu 11 lub wyższym
onBackPressed()
robienie niczego w jego ciele
To, co zadziałało, to stworzenie DialogFragment
zestawu, którego nie można anulować:
dialog.setCancelable(false);
Gdy używasz okna dialogowego jako działania w onCreate, dodaj to
setFinishOnTouchOutside(false);
W przypadku wyższego interfejsu API 10 okno dialogowe znika po dotknięciu na zewnątrz, natomiast w interfejsie niższym niż API 11 okno dialogowe nie znika. Aby temu zapobiec, musisz:
W styles.xml
:<item name="android:windowCloseOnTouchOutside">false</item>
LUB
W onCreate()
metodzie użyj:this.setFinishOnTouchOutside(false);
Uwaga: w przypadku API 10 i niższych ta metoda nie działa i nie jest potrzebna.
Wystarczy ustawić wartość parametru cancelable na false, a albo dotkniesz okna dialogowego alertu, albo klikniesz przycisk Wstecz, zniknie okno alertu. Więc użyj tego:
setCancelable(false)
A druga funkcja nie jest już konieczna:
dialog.setCanceledOnTouchOutside(false);
Jeśli tworzysz tymczasowe okno dialogowe i zastanawiasz się nad umieszczeniem tego wiersza kodu, oto przykład:
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();
Użyj tego kodu, to działa dla mnie
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setCancelable(false);
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.
Obejrzyj ten link, aby uzyskać więcej informacji na temat okna dialogowego.
dialog.setCancelable(false);
//used to prevent the dismiss of dialog on backpress of that activity
dialog.setCancelable(true);
//used to dismiss the dialog on onbackpressed of that activity
Po prostu,
alertDialog.setCancelable(false);
uniemożliwić użytkownikowi kliknięcie poza oknem dialogowym.
Alert Dialog jest przestarzały, więc użyj Dialog dialog = new Dialog (this);
Aby zapobiec zbliżeniu na dotyk zewnętrzny
dialog.setCanceledOnTouchOutside(false);
Użyj setFinishOnTouchOutside(false)
dla API> 11 i nie martw się, ponieważ domyślne zachowanie Androida, że okno dialogowe o tematyce aktywności nie zostanie ukończone na zewnętrznym interfejsie dla API <11 :) !! Pozdrawiam !!
Używam tego w onCreate (), wydaje się działać na dowolnej wersji Androida; testowane na 5.0 i 4.4.x, nie można testować na Gingerbread, urządzenia Samsung (Uwaga 1 z GB) domyślnie mają to w ten sposób:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
setFinishOnTouchOutside(false);
}
else
{
getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
}
super.onCreate(savedInstanceState);
alert.setCancelable(false);
alert.setCanceledOnTouchOutside(false);
Myślę, że to ci pomoże. To zadziałało dla mnie
Oto moje rozwiązanie:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select The Difficulty Level");
builder.setCancelable(false);
Możliwe jest także przypisanie różnych akcji implementujących onCancelListener:
alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){
@Override
public void onCancel(DialogInterface dialogInterface) {
//Your custom logic
}
});
Miałem ten sam problem. Aby sobie z tym poradzić, ustawiam OntouchListener
w oknie dialogowym i nic nie robię w środku. Ale okno dialogowe odrzuca się również podczas obracania ekranu. Aby to naprawić, ustawiam zmienną, która informuje mnie, czy okno dialogowe zwykle zostało zamknięte. Następnie ustawiam a OnDismissListener
w oknie dialogowym i sprawdzam zmienną. Jeśli okno dialogowe nie działa normalnie, nic nie robię, bo inaczej uruchamiam je ponownie (i w moim przypadku ustawiam jego stan jak w przypadku zwolnienia).
builder.setCancelable (false);
public void Mensaje (Zobacz 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();
}
To idealna odpowiedź na wszystkie pytania .... Mam nadzieję, że lubisz kodować w Androidzie
new AlertDialog.Builder(this)
.setTitle("Akshat Rastogi Is Great")
.setCancelable(false)
.setMessage("I am the best Android Programmer")
.setPositiveButton("I agree", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.create().show();