2009-09-17 10 views
5

He tenido este problema en algunas aplicaciones diferentes ahora y parece que no puedo encontrar una solución.Pantallas negras sólidas al llamar a Diálogos en onCreate()

Si, en el onCreate() de Activity, comienzo una actividad que utiliza el tema del diálogo, no dibuja nada en la pantalla ... toda la pantalla permanece en negro. Todas las vistas están allí (por ejemplo, puedo tocar donde debería estar EditText y me dará el teclado), simplemente no son visibles.

¿Alguien tiene alguna idea?

ejemplo sencillo Stupid, para la diversión:

public class MainActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.main); 
     startActivityForResult(new Intent(this, CredentialsInputActivity.class), 1); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     // do some crap with the result, doesn't really matter what 
    } 
} 

CredentialsInputActivity es bastante sencillo ... sólo se extiende Activity y tiene el tema establecido en @android:style/Theme.Dialog en el archivo de manifiesto.

Respuesta

6

Resulta que este es un known bug en 1.5 (corregido en 1.6 y nunca fue un problema en 1.1). El error surge de la animación de la nueva Actividad que tiene lugar antes de que se haya dibujado la Actividad anterior, pero solo se presenta si la Actividad "anterior" fue la primera Actividad en la Tarea.

Una solución consiste en desactivar la animación del tema. La forma más sencilla de hacerlo es con un nuevo tema que amplía el tema principal del diálogo.

res/valores/themes.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="CupcakeDialog" parent="android:Theme.Dialog"> 
     <item name="android:windowAnimationStyle">@null</item> 
    </style> 
</resources> 

A continuación, sólo hacer referencia a ella en su AndroidManifest.xml:

<!-- ... --> 
<activity 
    android:name=".CredentialsInputActivity" 
    android:label="@string/CredentialsInputActivity_window_title" 
    android:theme="@style/CupcakeDialog" /> 
<!-- ... --> 

Obviamente, usted suelta la animación, pero al menos se puede ver :)

Nota: la solución de commonsware.com funcionó bien también con la advertencia que anoté en los comentarios.

+0

El error no parece estar solucionado en 1.6, por lo que puedo decir ... – polyglot

1

Sólo una conjetura aquí ...

creo @android:style/Theme.Dialog están destinados para la mayor parte de los antecedentes de ser translúcido. Inicialmente, el fondo de su MainActivity es negro. Si el startActivityForResult() se activa antes de que su MainActivity llegue a dibujar, eso podría explicar su problema.

Intente usar postDelayed() en un View para retrasar su startActivityForResult() en algunos cientos de milisegundos, y vea si eso cambia el comportamiento.

+0

Pensé en esto (no haber tenido la oportunidad de dibujar), pero decidí que no me gustaba porque ¿la nueva actividad aún no debería estar visible, aunque sea solo por poco? De todos modos ... lo probaré mañana y veré qué pasa. –

+0

Hubiera esperado que el setContentView() se manejara antes de startActivityForResult(). Sin embargo, las formas de Android son misteriosas, y por lo tanto, en función de su experiencia, creo que startActivityForResult() se procesa primero. – CommonsWare

+1

Esto funcionó bien (en ese tipo de "hackers"); ...) ... sería bueno si la actividad tuviera un onDisplayed() o algo así para poder saber cuándo está visible. NOTA: Hacerlo en una Vista dentro de la primera Actividad (Actividad Principal anterior) lo hizo de modo que cada vez que se dibujara se ejecutaría ondraw(), suena como lo que quiere, pero un efecto secundario inesperado (para mí) fue que si abres el teclado en pantalla en la subactividad, la actividad principal se dibuja de nuevo y te muestra otra ventana emergente. Algo a tener en cuenta al programarlo. –

Cuestiones relacionadas