2011-04-22 17 views
24

Tengo un problema con una aplicación de Android en la que estoy trabajando.¿Cómo puedo iniciar una nueva actividad de Android usando una cadena?

Mi aplicación tiene varias secciones y la siguiente pantalla que las cargas se basa en una cadena. Entonces, la pantalla 1 de la sección 1 sería, S1S1.

Mi pregunta es, ¿cómo puedo empezar una actividad basada en una cadena. Tengo S1S1 guardado en una cadena, llamémoslo nextactivity. En lugar de tener que escribir S1S1.class, necesito que venga de la cadena. He aprendido todo lo que puedo decir y google no me ayudó mucho.

Algunas cosas que he probado son

Intent myIntent = new Intent(nextactivity); 
Intent myIntent = new Intent(v.getContext(), getClass().getName().valueOf(nextactivity)); 
Intent myIntent = new Intent(v.getContext(), Class.forName(nextactivity)); 

y trató de correr con

startActivityForResult(myIntent, 0); 

pero nada parece funcionar. ¿Algunas ideas?

Respuesta

52

Aquí es un código mediante el cual se puede iniciar la actividad con el nombre de la actividad

String activityToStart = "com.example.MainActivity"; 
try { 
    Class<?> c = Class.forName(activityToStart); 
    Intent intent = new Intent(this, c); 
    startActivity(intent); 
} catch (ClassNotFoundException ignored) { 
} 

EDITAR

Aquí el nombre de clase será el nombre completo de la clase con el p nombre de Ackage. Por ejemplo, si el nombre del paquete será x.y.z y si tiene el nombre actividad denominada A entonces el nombre completo de la actividad A será x.y.z.A.

+0

Reemplacé StringClassname con "End", una actividad que sé que existe ... pero todo lo que obtengo es una ClassNotFoundException y una java.lang.NullPointerException reemplacé mail.this con v. getContext() y también probé "End.class" pero eso tampoco hizo nada. – fahadayaz

+0

Ver la respuesta editada EDITAR @fahadayaz – Dharmendra

+0

¡ah, ahora funciona genial! ¡Gracias! – fahadayaz

-1

¡Usa Enums!

public enum SectionActivity { 

    S1S1(MyS1Activity.class), 
    S1S2(S2Activity.class); 

    private Class<? extends Activity> activityClass; 

    private SectionActivity(Class<? extends Activity> clazz) { 

    this.activityClass = clazz; 
    } 

    public Class<? extends Activity> getActivity { 
    return activityClass; 
    }  
} 

Entonces en algún lugar de su código:

SectionActivity act = SectionActivity.valueOf(string); 
Intent intent = new Intent(this, act.getActivity()); 
startActivity(intent); 
+0

esta solución funcionó para mí también, pero desde el otro era menos código y más directo, es probable que funcione más rápido. Esto también tendrá sus usos, ¡gracias! – fahadayaz

+0

No estoy de acuerdo con usted. La otra solución usa reflexión y también funciona en try block. Es una cuestión de medida, por supuesto, pero al menos no estoy seguro de quién es la solución más rápida. Además, enum es una clase final y sus miembros son estáticos finales, por lo que Android lo optimizará bien. –

+0

¡Interesante!¿Hay alguna herramienta que me permita medir el rendimiento usando los diferentes métodos? Conseguí que ambos funcionaran, así que puedo ver cuál es el más optimizado. – fahadayaz

0

No estoy al tanto de la solución, pero no tengo una alternativa .. la forma similar a div ocultar y mostrar en las páginas web.

si su S1S1 es de bajo contenido cargado ellos tienen en un LinearLayout y mantener su visibilidad ha ido en forma de carga S1. cuando haces clic en s1 para alcanzar s1s1, escondes s1 y configuras los parámetros de visibilidad en "visible".

De esta manera se puede evitar la creación de una actividad independiente y de esta manera es también fácil de navegar de vuelta.

+0

¡Gracias por el consejo! Lo tendré en cuenta para el futuro. :) – fahadayaz

27

Una forma aún mejor (y uno que se utiliza en el sistema para lanzar Browser.apk junto con otras aplicaciones que no están incluidas con AOSP):

Intent intent = new Intent(); 
intent.setClassName("com.android.browser","com.android.BrowserActivity"); 

context.startActivity(intent); 

Alternativamente, si desea comprobar que puede iniciar el Activity desde la línea de comandos, puede hacer algo como esto desde el shell:

adb shell 
am start com.android.browser/.BrowserActivity 
+0

¿Qué sucede si no se encuentra la actividad? Un ejemplo de cuándo esto puede suceder es con compilaciones de gradle con sabor que no incluyen ciertas clases. –

+6

Esta es la mejor respuesta. También puede hacer esto: 'intent.setClassName (context, context.getPackageName() +" .MyActivity ");' – Richard

+0

Funciona como un encanto. –

Cuestiones relacionadas