2013-05-10 15 views
73

Pracuję w aplikacji Android i używam DialogFragment, aby wyświetlić okno dialogowe i chcę, aby DialogFragment nie podlegał anulowaniu. Ustawiłem właściwość cancelable okna dialogowego na false, ale nadal nie ma to wpływu.Zestaw DialogFragmentAlicencja Właściwość nie działa

Proszę zajrzeć do mojego kodu i zaproponować rozwiązanie.

public class DialogTest extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     return super.onCreateDialog(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.dialog_test, container, true); 
     getDialog().requestWindowFeature(STYLE_NO_TITLE); 
     getDialog().setCancelable(false); 

     return view; 
    } 
} 
+19

zamiast getDialog() setCancelable (false); ci powinien zadzwonić setCancelable (fałsz); – Blackbelt

+0

, jeśli klikniesz poza granicę dialogu, to trzeba go także odrzucić? –

+0

Próbujesz kanapki z lodami? Odwołaj się do linku podanego pod adresem http://www.fantasypublishings.com/morePhpHelp/ice_cream_sandwich__android_40_Dialog_gets_canceled_when_touched_outside_of_dialog_window__Stack_Overflow_page93701 .php – Remmyabhavan

Odpowiedz

171
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.dialog_test, container, true); 
    getDialog().requestWindowFeature(STYLE_NO_TITLE); 
    getDialog().setCancelable(false); 

    return view; 
} 

zamiast getDialog().setCancelable(false); ty muszą używać bezpośrednio: setCancelable(false);

tak zaktualizowana odpowiedź będzie tak

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.dialog_test, container, true); 
    getDialog().requestWindowFeature(STYLE_NO_TITLE); 
    setCancelable(false); 

    return view; 
} 
+0

To naprawdę niesamowita wskazówka, DZIĘKI. Zastanawiam się, dlaczego, powiedzmy * dialog.getWindow(). RequestFeature (-) * musisz "uwzględnić okno dialogowe" na getWindow? – Fattie

+5

To nie jest wskazówka. Fragment jest zawijaniem twojego okna dialogowego, to normalne, że musisz poradzić sobie z fragmentem zamiast samego okna;) –

+1

Jeśli nie zastąpisz onCreateView, setCancelable (false) można również wywołać z publicznego okna dialogowego onCreateDialog (Pakiet savedInstanceState) – user2924714

41

Użyj następujący fragment

void showDialog() { 
    DialogFragment newFragment = MyAlertDialogFragment.newInstance(
      R.string..alert_dialog_two_buttons_title); 
    newFragment.setCancelable(false); 
    newFragment.show(getFragmentManager(), "dialog"); 
} 

i jeśli chcesz wyłączyć wyjście dotyk boczną wokół wykorzystania dialogowym następujący wiersz kodu

DialogFragment.getDialog().setCanceledOnTouchOutside(true); 
+1

Powinna to być zaakceptowana odpowiedź dotyczy zarówno fragmentów okien dialogowych alertów wanilii, jak i niestandardowych fragmentów okien dialogowych. –

25

w przypadku powiadomienie budowniczy użyć (i prawdopodobnie w każdym przypadku owinąć dialog wewnątrz DialogFragment), aby pomóc budować swój dialog, proszę nie używać getDialog () .setCancelable (false) lub Dialog.setCancelable (false) ponieważ to nie zadziała. Zastosowanie setCancelable (fałsz), jak przedstawiono w kodzie poniżej jak to wspomniano w oficial android dokumentacji:

public void setCancelable (boolean cancelable) 

Dodane w poziomie API 11 sterowania czy pokazane dialogowe można anulować. Użyj tego zamiast bezpośredniego wywoływania Dialog.setCancelable (logiczna), ponieważ DialogFragment musi zmienić swoje zachowanie na podstawie tego „

Ref.:. http://developer.android.com/reference/android/app/DialogFragment.html#setCancelable(boolean)

public class MyDialogFragment extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     View view = inflater.inflate(R.layout.dialog_layout, null, false); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) 
       .setTitle("in case you want use a title").setView(view); 

     AlertDialog alert = builder.create(); 
     // alert.setCancelable(false); <-- dont' use that instead use bellow approach 
     setCancelable(false); <- press back button not cancel dialog, this one works fine 
     alert.setCanceledOnTouchOutside(false); <- to cancel outside touch 

     return alert; 
} 
+0

Tak, próbuję powyższego rozwiązania, nawet sprawdzonego, ale nie działa dla mnie, ta odpowiedź jest nowa, więc potrzebuję czasu, aby zostać przegłosowanym, i tak dziękuję. – Xenione

+0

To prawda, nawet jeśli uważam, że to zachowanie ze strony Androida jest dość dziwne, ponieważ jawnie używasz na przykład AlertDialog.Builder do budowania okna dialogowego, uważasz, że te atrybuty zastępują podklasy. Ale może czegoś tutaj brakuje? – Robert

+0

Myślę, że dialog behaviur po zawinięty w okienko dialogowe nie reaguje już na AlertDialog lub na czas uświęcenia. Myślę, że zamiast tego wszystko przechodzi przez fragmentDialog. – Xenione

Powiązane problemy