2011-01-31 14 views
43

¿Hay alguna manera de cambiar dinámicamente la actividad de inicio en Android en función de una condición? Lo que he tratado de hacer (que no funcionaba) fue la siguiente:Actividad de inicio dinámico en Android?

  1. eliminar la categoría LANZADOR como se define en mi AndroidManifest.xml
  2. crear una clase de aplicaciones personalizadas que la aplicación utiliza
  3. anulación de la método onCreate de mi clase de aplicación para definir algún código como el siguiente:

.

if (condition) { 
    startActivity(new Intent(this, MenuActivity.class)); 
} else { 
    startActivity(new Intent(this, LoginActivity.class)); 
} 
+3

exactamente lo que busqué, gracias por preguntar esto ya. – mad

Respuesta

56

Por qué no tener una inicial Activity sin interfaz de usuario que se comprueba la condición en su onCreate, a continuación, pone en marcha la próxima Activity, a continuación, llama finish() sobre sí misma? Nunca he llamado finish() desde onCreate(), así que no estoy seguro de si esto funcionará.

EDIT
Parece que funciona bien. Aquí hay un código para hacerlo más claro.
inicial Activity:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Intent intent; 
    if (condition) { 
     intent = new Intent(this, ClassA.class); 
    } else { 
     intent = new Intent(this, ClassB.class); 
    } 
    startActivity(intent); 
    finish(); 
    // note we never called setContentView() 
} 

Otros Activity:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 
+0

¿Puedes tener una actividad sin UI? Pensé que el objetivo de una Actividad era mostrarle algo al usuario, pero tal vez tenga que volver a leer lo básico de Android ... –

+1

@Matt Huggins Acabo de probarlo en mi espacio de trabajo temporal y parece funcionar bien. –

+1

Ese es el objetivo de una actividad, pero hay muchas formas de evitarlo. Creo que lo que Dave quiso decir fue que no declaraste una IU. No hay nada que requiera que llame a setContentView o cualquier cosa. Simplemente haga su verificación, comience su próxima actividad y continúe con ella. – Falmarri

8

Esto es lo que yo personalmente hice para uno de mis pequeños proyectos móviles. En lugar de crear una por separado, pantalla-menos Activity donde la condición es y que pone en marcha la pantalla correspondiente, puse la condición en una Activity e hice una dinámica setContentView(), como en:

if (!userIsLoggedIn) { 
    setContentView(R.layout.signup); 
} else { 
    setContentView(R.layout.homescreen); 
} 

Dos notas importantes a este enfoque :

1: En lugar de escribir eso en onCreate(), desea poner la toma de decisiones dentro de onResume() precisamente porque este último siempre se invoca cuando la pantalla debe mostrarse al frente. Puedes ver eso desde Android activity life cycle. Entonces, si, por ejemplo, el usuario acaba de descargar mi aplicación y la lanzó por primera vez, porque ningún usuario ha iniciado sesión, se le dirigirá a la página de registro. Cuando termine de registrarse y por algún motivo presiona el botón HOME (no BACK, que sale de la aplicación por completo) y luego reanuda la aplicación, el diseño que verá ya es la pantalla de inicio. Si pongo el condicional dentro de onCreate(), lo que se habría mostrado es la pantalla de registro porque, de acuerdo con el ciclo de vida, no vuelve a onCreate() cuando trae de vuelta una aplicación al frente.

2: Esta solución es ideal solo si fusionar las funcionalidades de esas dos actividades no produciría un bloque de código largo y diabólico. Como dije, mi proyecto era pequeño (su función principal ocurre en segundo plano), por lo que el único Activity dinámico no tenía demasiado. La pantalla sin pantalla Activity es definitivamente el camino a seguir si necesita que su código sea más legible.

+3

+1 para compartir un método alternativo. :) Como ya lo mencionó, mi única preocupación con este método es que cada vista podría requerir un conjunto de código subyacente en gran medida diferente, lo que haría que la Actividad fuera voluminosa e incongruente. –

+1

@MattHuggins, esta solución probablemente funcione mejor si usa 'Fragment's que encapsula el' contentView' y el '' conjunto de código subyacente '' muy diferente. – TWiStErRob

Cuestiones relacionadas