2012-03-29 13 views
7

Quiero iniciar un nuevo Inten dinámicamente. Por lo tanto, setClassName parece la mejor opción.No se puede iniciar un nuevo intento por setClassName con un paquete diferente en Android

Primero, defino 3 actividad en el manifiesto

<activity android:name="com.example.pkg2.Act" /> 
<activity android:name="com.example.pkg1.Act1" /> 
<activity android:name="com.example.pkg1.Act2" /> 

De com.example.pkg2.Act:

Intent intent = new Intent(); 
if(index == 0) intent.setClassName(Act.this, "com.example.pkg1.Act1"); 
else intent.setClassName(Act.this, "com.example.pkg1.Act2"); 
startActivity(intent); 

y conseguirá esta excepción:

Unable to find explicit activity class {com.example.pkg2.Act/com.example.pkg1.Act1}; have you declared this activity in your AndroidManifest.xml? 

Parece que sólo podemos usar setClassName para iniciar dinámicamente una nueva actividad pero dentro del mismo paquete.

¿Alguna idea para resolver este problema? Toda la ayuda es apreciada.

+0

'' cambio Act1 a ACT2 se ha declarado Act1 dos ¿veces? –

+0

Gracias @imrankhan Es mi culpa cuando copie y pegue: p – anticafe

+0

está bien, vea mi respuesta actualizada. –

Respuesta

12

setClassName tomar un Contexto paquete como primer parámetro setClassName(Context packageContext, String className):

Intent intent = new Intent(); 
if(index == 0) { 
    intent.setClassName("com.example.pkg1", "com.example.pkg1.Act1"); 
} else { 
    intent.setClassName("com.example.pkg1", "com.example.pkg1.Act2"); 
    startActivity(intent); 
} 

y en

<activity android:name="com.example.pkg2.Act" /> 
<activity android:name="com.example.pkg1.Act1" /> 
<activity android:name="com.example.pkg1.Act2" /> 

o intenta esto:

if(index == 0) { 
    Intent intent = new Intent(Intent.ACTION_MAIN) 
    .addCategory(intent.CATEGORY_LAUNCHER) 
    .setClassName("com.example.pkg1", "com.example.pkg1.Act1") 
    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 
    .addFlags(Intent.FLAG_FROM_BACKGROUND) 
    .setComponent(new ComponentName("com.example.pkg1", "com.example.pkg1.Act1")); 
    getApplicationContext().startActivity(intent); 
} else { 
    Intent intent = new Intent(Intent.ACTION_MAIN) 
    .addCategory(intent.CATEGORY_LAUNCHER) 
    .setClassName("com.example.pkg1", "com.example.pkg1.Act2") 
    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 
    .addFlags(Intent.FLAG_FROM_BACKGROUND) 
    .setComponent(new ComponentName("com.example.pkg1", "com.example.pkg1.Act2")); 
    getApplicationContext().startActivity(intent); 
} 
+0

Lo siento, no funciona. El mismo error: -s – anticafe

0

Siga la sintaxis para escribir setClassName) método (:

setClassName(pkgName, className) 
+0

Gracias por su respuesta, pero tampoco funciona. – anticafe

-1
intent.setClassName(Act.this, Act1.class); 
0

Usted puede utilizar el siguiente método para crear la intención en el contexto del paquete:

Intent intent = new Intent(this, MyActivity.class); 
    intent.setAction(Intent.ACTION_VIEW); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 

esta manera a mantener el código genérico.

HTH

0

intent.setClassName (packageName, className);

donde
packageName - El nombre del paquete que implementa el componente deseado, es decir, el paquete al que pertenece la persona que llama.
className - Nombre completo de la clase [de paquete diferente]

Llamar desde com.example.pkg2.Act:

intent.setClassName("com.example.pkg2", "com.example.pkg1.Act1"); 
2

El primer parámetro es el applicationId situado en el build.gradle archivo

El segundo parámetro es el camino completo de la clase con su paquete. por ejemplo: intentObj.setClassName ("applicatioId", "com.youCompany.yourAppName.YourClassName")

0

Use este código y se le multa.

Intent intent = new Intent(); 
String resourcePackageName = getResources().getResourcePackageName(R.string.some_defined_resource); 
intent.setClassName(getApplicationContext().getPackageName(),resourcePackageName + ".SubPackageName[/if any/].ClassName"); 
startActivity(intent); 
0

También puede iniciar Actividades de esta manera. Prueba este

Intent intent = new Intent(); 
Class<?> activityClass = Class.forName("your.application.package.name." + NameOfClassToOpen); 
intent.setClass(this, activityClass); 

Y con el fin de utilizar setClassName. Usted debe suministrar con packageName y su ruta de clase también, como

intent.setClassName("your.application.package.name", "your.application.package.name.activityClass"); 
Cuestiones relacionadas