2011-06-30 25 views
7

Tengo una actividad simple que solo muestra dos botones, y me gustaría cargar otra actividad tan pronto como termine de cargarse.iniciar una nueva actividad en onCreate funciona solo con retraso

@Override 
public void onCreate(Bundle savedInstanceState) { 
    dbg("starting on create"); 
    super.onCreate(savedInstanceState); 

    dbg("stting content view"); 
    setContentView(R.layout.main); 

    createDrPopup(); 

} 

private void createDrPopup(){ 
    dbg("created new activity"); 
    startActivityForResult(new Intent(this, DrPopup.class), 
          DR_POPUP_ACTIVITY_ID); 
} 

No obtengo ningún error con este código, pero la actividad nueva no se carga correctamente. De esta manera solo obtengo una pantalla en blanco.

Pero si llamo a la nueva actividad con un retraso, entonces todo funciona bien.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    dbg("starting on create"); 
    super.onCreate(savedInstanceState); 

    dbg("stting content view"); 
    setContentView(R.layout.main); 

    Thread splashTread = new Thread() { 
     @Override 
     public void run() { 
      try { 
       sleep(500); 
      } catch(InterruptedException e) { 
      } finally { 
       createDrPopup(); 
      } 
     } 
    }; 
    splashTread.start(); 
} 

private void createDrPopup(){ 
    dbg("created new activity"); 
    startActivityForResult(new Intent(this, DrPopup.class), 
          DR_POPUP_ACTIVITY_ID); 
} 

mi pregunta es la siguiente:

¿Hay alguna forma mejor esperar a que una actividad se termine de cargar. Ni siquiera puedo estar seguro de que 500ms sean suficientes cada vez.

Gracias por cualquier sugerencia.

código solicitado para dr_popup (esto es tan simple como se pone)

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    dbg("Created new activity"); 

    setContentView(R.layout.dr_webview); 
    dbg("web view created"); 

} 

y ambos diseños

principales

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 
    <Spinner android:layout_height="wrap_content" android:layout_weight="1" android:layout_width="wrap_content" android:id="@+id/spinner1"></Spinner> 
</LinearLayout> 

emergente

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dr_popup_webview_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> 
    <WebView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dr_popup_webview" android:layout_width="fill_parent" android:layout_height="100dip"/> 
    <LinearLayout android:id="@+id/frameLayout1" android:layout_height="100dip" android:layout_width="fill_parent" android:orientation="horizontal"> 
     <EditText android:id="@+id/dr_submit_text"   android:layout_height="wrap_content"   android:layout_width="wrap_content"   android:layout_weight="4"> 
      <requestFocus></requestFocus> 
     </EditText> 
     <Button    android:text="Button"   android:id="@+id/dr_submit_button"   android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_weight="1"></Button> 
    </LinearLayout> 
</LinearLayout> 

edición: la problema EMS para ser causada por el manifiesto de la línea @android: Estilo/Theme.Dialog

<activity android:theme="@android:style/Theme.Dialog" 
       android:name=".DrPopup" 
       android:label="@string/dr_popup"> 
    </activity> 

Si quito eso, las cosas parecen funcionar, pero me gustaría una solución que trabajar aún con esa línea.

y una imagen que muestra el problema. http://i.imgur.com/ZOcyw.png

+0

Hola también puede proporcionar el código para DrPopup. – Deva

+1

Bueno, no estoy seguro, pero tal vez el ActivityManager no puede manejar el inicio de una nueva actividad cuando otra actividad todavía está en el método de ciclo de vida onCreate(). El temporizador permite suficiente tiempo para que onCreate() complete ... –

+0

He agregado el código y los archivos xml también, y debo agregar que estoy trabajando en Android 1.5 – zidarsk8

Respuesta

5

No veo ningún motivo del código proporcionado por qué tiene que insertar un retraso de 500 ms ... No tiene sentido insertar ese retraso. Algunas aclaraciones son necesarias: 1. ¿Hizo un procesamiento pesado dentro de la actividad original? 2. startActivityForResult se invoca con un propósito (dado que los fragmentos de su código no muestran ninguna implementación de la actividadActivityResult)?

voy a tratar de poner en práctica un ejemplo mínimo y actualizar el mensaje lo antes posible ...

- Actualización

Después de varios intentos de comprender y solucionar este problema con una sesión de chat en paralelo, que reproduce el problema en una nuevo 1.5 emulador. El problema finalmente proviene del uso de android: theme = "@ android: style/Theme.Dialog" para la actividad de llamada. El problema se observa en Android 1.5 (dispositivo y emulador). Lo que se declara en el segundo diseño, cada vez que se inicia la actividad asociada, no se muestra nada. La pantalla está en blanco y presionar el botón Atrás inicia una visualización transitoria de la actividad pero pasa a la primera actividad (la parte posterior es nominal). No pude explicar por qué sucede esto y le sugiero a zidarsk8 que pruebe PopupWindow o defina un estilo personalizado (enfoque de prueba/error basado en la definición de origen de Android Theme.Dialog).

+0

Estoy de acuerdo en que es una tontería total, eso es lo que Estoy preguntando aquí, porque no tengo idea de por qué esto funcionaría solo con la demora. Pero ese parece ser el caso. – zidarsk8

+0

Lo intenté desde onStart, pero el resultado es el mismo, comenzar sin demora hace que la nueva actividad no tenga botones ni nada. – zidarsk8

+0

Funciona aquí sin demora (con una actividad de inicio simple) excepto que WebView aparece después de otros elementos de diseño. – Renaud

Cuestiones relacionadas