5

Sto provando a utilizzare le nuove finestre di dialogo a tema materiale con i frammenti in AppCompat v22.1. According to Chris Banes, per fare questo:DialogFragment con AppCompatDialog si arresta in modo anomalo se STYLE_NO_TITLE è impostato

appena tornati da new AppCompatDialog(getActivity(), getTheme()) onCreateDialog(Bundle).

Mettere in piedi:

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

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

    ... 
} 

funziona perfettamente in caso normale; il dialogo è correttamente a tema e tutto. Tuttavia, quando cerchiamo di mostrare una finestra di dialogo con l'opzione STYLE_NO_TITLE:

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

provoca la seguente eccezione e crash:

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) 

Credo che il problema potrebbe essere correlato a DialogFragment chiamando requestWindowFeature() invece di supportRequestWindowFeature() (?)

Esiste una soluzione alternativa per questo problema?

+2

è relativo a questo: https://code.google.com/p/android/issues/detail?id=170053? – Blackbelt

+0

@Blackbelt Sì, è sicuramente lo stesso, grazie. – matiash

+0

Siete i benvenuti – Blackbelt

risposta

3

Questo era un bug in AppCompat v22.1 che era fixed in v22.1.1.

Si è rotto di nuovo in v23 e was fixed once more, in v23.0.1.

Funziona bene al momento della stesura di questo documento.

+0

qualsiasi idea di questa finestra di dialogo dei frammenti si blocca con v23.0.1? http://stackoverflow.com/questions/32813894/v7-support-23-0-1-crash-appcompatbutton-setbackgrounddrawable –

2

In base ai problemi del collegamento di Blackbelt, è necessario restituire AppCompatDialog e utilizzare supportRequestWindowFeature(). Propongo cambiamento come questo:

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

o meglio, cercate di non toccare codice originale:

@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

Grazie. In realtà, questo era un bug nella libreria di supporto ed è già stato risolto. – matiash

+0

Mi hai salvato da un sacco di mal di testa ... – Pedram

Problemi correlati