9

Estoy en el proceso de hacer un proyecto de panal/tenedor compatible con versiones anteriores de 1.6+.DialogFragments with devices api level <11

Basado en la documentación provista por Google/Android decidí construir todos mis fragmentos DialogFragment s que funcionaron bien para honeycomb ... me da la flexibilidad de poner algo como un elemento de diálogo o 'pantalla completa'.

Ahora he incorporado el kit de compatibilidad y moví mis importaciones y llamadas de método a eso. Ahora que estoy en 2.3 Estoy tratando de poner en marcha una intención idéntica pero recibo este tema:

java.lang.IllegalStateException: DialogFragment can not be attached to a container view 

La documentación para DialogFragment sugiere que puede actuar como Fragment cuando no se desea la funcionalidad de diálogo/emergente .

Respuesta

9

me las arreglé para solucionar este problema adecuadamente en DialogFragment.java del Paquete de compatibilidad:

Cambiar la línea 74: boolean mShowsDialog = false;

como comentario la línea 232: //mShowsDialog = mContainerId == 0;

a continuación, cambiar los dos métodos de demostración a esto:

public void show(FragmentManager manager, String tag) { 
    this.setShowsDialog(true); 
    FragmentTransaction ft = manager.beginTransaction(); 
    ft.add(this, tag); 
    ft.commit(); 
} 

// JavaDoc removed 
public int show(FragmentTransaction transaction, String tag) { 
    this.setShowsDialog(true); 
    transaction.add(this, tag); 
    mRemoved = false; 
    mBackStackId = transaction.commit(); 
    return mBackStackId; 
} 

Básicamente, escribieron como soporte, pero el cambio para alternar entre diálogo/integrado no funciona.

Por lo tanto, aquí vamos de forma predeterminada a incrustado, y luego configuramos para mostrar como un diálogo justo antes de mostrarlo.

+0

también : 'onSaveInstanceState' solo debería guardar' mShowsDialog' si es 'true'. Solo tiene que eliminar el '!' Del 'si'. –

+0

¿En qué revisión (alias SHA1 commit id de https://android.googlesource.com/platform/frameworks/support) está basado en este conjunto de cambios?Estoy tratando de reproducir su solución con la versión actual de la biblioteca de soporte, pero tengo problemas para hacerlo correctamente, ya que aparentemente Google no se etiquetó con el código de revisión r que están utilizando para las versiones. Lo he intentado con commit 863d7b4. –

+0

Quise decir: he comparado su conjunto de cambios con commit 863d7b4. –

2

He tenido el mismo problema. Nunca encontré una solución "correcta", pero puede hacer lo mismo configurando el tema del cuadro de diálogo en OnCreateDialog(). Al configurar el tema en android.R.style.Theme_Holo_DialogWhenLarge, el diálogo se mostrará como un cuadro de diálogo en pantallas grandes y x grandes, mientras que se mostrará como una ventana de pantalla completa en pantallas pequeñas y normales.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_DialogWhenLarge); 
} 
0

¿Revisó la nota de la aplicación? Muestra una forma recomendada de incrustar un diálogo, y he verificado que esto funciona en 2.2.1.

http://developer.android.com/reference/android/app/DialogFragment.html#DialogOrEmbed

Mi diseño fragmento tenía que cambiar para ajustarse pero fue rápido y fácil. Es más natural poder definir el fragmento de diálogo en XML y esperar que se incruste sin ningún trabajo adicional (ya que los cambios anteriores a Compat API son compatibles); y solo esperar comportamiento modal cuando se llama a través de show(). Supongo que ese no es el comportamiento actual.

2

Estoy usando una clase para niños DialogFragment y estoy haciendo este truco en los trabajos de onCreate(). Me llamo setShowsDialog() antes de onCreate() se llama (en el onAttachFragment() de mi actividad)

public class DialogFragmentHosted extends DialogFragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     boolean forceShowDialog = savedInstanceState==null; 
     boolean showsDialog = getShowsDialog(); 
     super.onCreate(savedInstanceState); 
     if (forceShowDialog) 
      setShowsDialog(showsDialog); 
    } 
} 
3

Usted puede utilizar la versión android.support.v4.app.DialogFragment, por favor marque here

Cuestiones relacionadas