5

Ich versuche, die neuen materialbezogenen Dialoge mit Fragmenten in AppCompat v22.1 zu verwenden. According to Chris Banes, um dies zu tun:DialogFragment mit AppCompatDialog stürzt ab, wenn STYLE_NO_TITLE festgelegt ist

Gerade new AppCompatDialog(getActivity(), getTheme()) Rückkehr von onCreateDialog(Bundle).

Einstellung auf den Punkt:

public class MyFragment extends DialogFragment 
{ 
    public MyFragment() { } 

    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new AppCompatDialog(getActivity(), getTheme()); 
    } 

    ... 
} 

funktioniert perfekt im Normalfall; Der Dialog ist korrekt thematisch und alles. Wenn wir jedoch versuchen, einen Dialog mit der STYLE_NO_TITLE Option zu zeigen:

MyFragment fragment = new MyFragment(); 
fragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0); 
fragment.show(getSupportFragmentManager(), "DIALOG"); 

es bewirkt, dass die folgende Ausnahme und Absturz:

05-19 12:18:38.806 15458-15458/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.example.test.testdialog, PID: 15458 
android.util.AndroidRuntimeException: requestFeature() must be called before adding content 
    at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:302) 
    at android.app.Dialog.requestWindowFeature(Dialog.java:1066) 
    at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:317) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) 
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

ich das Problem erraten könnte im Zusammenhang zu DialogFragmentrequestWindowFeature() Aufruf statt supportRequestWindowFeature() (?)

Gibt es eine Problemumgehung für dieses Problem?

+2

ist es damit verbunden: https://code.google.com/p/android/issues/detail?id=170053? – Blackbelt

+0

@Blackbelt Ja, es ist definitiv das Gleiche, danke. – matiash

+0

Sie sind willkommen – Blackbelt

Antwort

3

Dies ist ein Fehler in AppCompat v22.1 war die fixed in v22.1.1 war.

Es brach wieder in v23 und was fixed once more, in v23.0.1.

Es funktioniert ok, wie dieses Schreiben.

+0

eine Idee über dieses Fragment Dialogabsturz mit v23.0.1? http://stackoverflow.com/questions/32813894/v7-support-23-0-1-crash-appcompatbutton-setbackgrounddrawable –

2

Nach Ausgaben von Link von Blackbelt sollten wir AppCompatDialog zurückgeben und supportRequestWindowFeature() verwenden. Ich schlage vor, wie folgt ändern:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AppCompatDialog dialog = new AppCompatDialog(getActivity(), getTheme()); 
    return dialog; 
} 

@Override 
public void setupDialog(Dialog dialog, int style) { 
    switch (style) { 
     case STYLE_NO_INPUT: 
      dialog.getWindow().addFlags(
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
          WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 
      // fall through... 
     case STYLE_NO_FRAME: 
     case STYLE_NO_TITLE: 
      ((AppCompatDialog) dialog).supportRequestWindowFeature(Window.FEATURE_NO_TITLE); 
    } 
} 

oder besser, versuchen Sie nicht Original-Code zu berühren:

@Override 
public void setupDialog(Dialog dialog, int style) { 
    super.setupDialog(dialog,style); 
    if(style == STYLE_NO_TITLE) 
     ((AppCompatDialog) dialog).supportRequestWindowFeature(Window.FEATURE_NO_TITLE); 
} 
+0

Vielen Dank. Eigentlich war dies ein Fehler in der Support-Bibliothek und wurde bereits behoben. – matiash

+0

Sie ersparen mir viele Kopfschmerzen ... – Pedram