2013-05-10 11 views
73

Ich arbeite in einer Android-Anwendung und verwende eine DialogFragment, um ein Dialogfeld anzuzeigen, und ich möchte diese DialogFragment nicht abbrechen. Ich habe die cancelable-Eigenschaft des Dialogfelds auf "false" gesetzt, aber dies hat immer noch keine Auswirkungen.DialogFragment setCancelable Eigenschaft funktioniert nicht

Bitte schauen Sie in meinen Code und schlagen Sie mir eine Lösung vor.

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

statt getDialog() setCancelable (false); Sie sollte setCancelable (false); – Blackbelt

+0

anrufen, wenn Sie außerhalb der Grenzen des Dialogs klicken, muss es auch dismmised sein? –

+0

Probieren Sie in Eis Sandwich? Bitte beachten Sie den Link http://www.fantasypublishings.com/morePhpHelp/ice_cream_sandwich__android_40_Dialog_gets_canceled_when_touched_out_of_dialog_window__Stack_Overflow_page93701 .php – Remmyabhavan

Antwort

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

statt getDialog().setCancelable(false); Sie deaktivieren möchten muss direkt setCancelable(false);

verwenden

so die aktualisierte Antwort wie diese

@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

Das ist ein wirklich unglaublicher Tipp, DANKE. Ich frage mich warum, mit * dialog.getWindow(). RequestFeature (-) * müssen Sie "den Dialog" auf dem getWindow hinzufügen? – Fattie

+5

Es ist kein Tipp. Ein Fragment wickelt den Dialog ein, es ist normal, dass Sie sich mit dem Fragment statt dem Dialog selbst beschäftigen;) –

+1

Falls Sie die onCreateView nicht überschreiben, kann setCancelable (false) auch aus dem öffentlichen Dialog onCreateDialog (Bundle savedInstanceState) – user2924714

41

Verwenden Sie das folgende Snippet

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

und wenn man die aus der Seite berühren um Dialog Verwendung der folgenden Codezeile

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

Dies sollte die akzeptierte Antwort sein, wie es ist Dies gilt sowohl für Vanillewarnungsdialogfragmente als auch für benutzerdefinierte Dialogfragmente. –

25

Im Fall sein, werden Sie Alarm-Builder verwenden (und wahrscheinlich in jedem Fall, dass Sie Dialog in einem DialogFragment wickeln) Ihren Dialogs zum Aufbau, benutzen Sie bitte nicht getDialog () .setCancelable (false) oder Dialog.setCancelable (false) weil es nicht funktioniert. Verwenden setCancelable (false), wie in Code unten gezeigt, wie es in oficial android Dokumentation erwähnt wird:

public void setCancelable (boolean cancelable) 

Added in API-Ebene 11 Steuerung, ob der dargestellte Dialog kündbaren ist. Verwenden Sie diese Option, anstatt direkt Dialog.setCancelable (boolean) nennen, weil DialogFragment sein Verhalten ändern muss auf dieser Grundlage“

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

Ja versuche ich obige Lösung, auch die überprüfte, aber funktioniert nicht für mich, die Antwort ist neu, so brauchen Zeit, um upvoted, Danke trotzdem. – Xenione

+0

Nun, das ist wahr, auch wenn ich denke, dass dieses Verhalten von der Seite von Android ziemlich seltsam ist, wie Sie zum Beispiel explizit AlertDialog.Builder verwenden, um Ihr Dialogfeld aufzubauen, würden Sie denken, dass diese Attribute die Unterklassen außer Kraft setzen. Aber ich verpasse hier vielleicht etwas? – Robert

+0

Ich denke, dass das Dialogverhalten in ein Dialogfragment gehüllt ist, das nicht mehr dem AlertDialog entspricht oder zumindest dem Bigining entspricht. Ich denke, alles geht durch fragmentDialog statt. – Xenione

Verwandte Themen