2012-03-29 6 views
7

Voglio iniziare una nuova intenzione in modo dinamico. Pertanto setClassName sembra la scelta migliore.Impossibile avviare un nuovo intent da setClassName con diverso pacchetto in Android

In primo luogo, definire 3 attività nel manifesto

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

Da 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); 

E otterrà questa eccezione:

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

Sembra che siamo in grado di utilizzare solo setClassName per avviare dinamicamente una nuova attività ma all'interno dello stesso pacchetto.

Qualche idea per risolvere questo problema? Tutto l'aiuto è apprezzato.

+0

'' cambiamento Act1 per ACT2 si è dichiarato Act1 due volte? –

+0

Grazie a @imrankhan È colpa mia quando si copia-incolla: p – anticafe

+0

ok, guarda la mia risposta aggiornata. –

risposta

12

setClassName prendere un contesto Pacchetto come primo param 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); 
} 

e in

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

o si tenta this:

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

Spiacente, non funziona. Lo stesso errore: -s – anticafe

0

Seguire la sintassi di scrivere setClassName() metodo:

setClassName(pkgName, className) 
+0

Grazie per la risposta, ma non funziona. – anticafe

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

È possibile utilizzare il seguente metodo per creare l'intento nel contesto del pacchetto:

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

In questo modo si mantiene sul codice generico.

HTH

0

intent.setClassName (packageName, className);

dove
packageName: il nome del pacchetto che implementa il componente desiderato, ovvero il pacchetto a cui appartiene il chiamante.
className - nome completo della classe [dal pacchetto differente]

Chiamata dalla com.example.pkg2.Act:

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

Il primo parametro è il ApplicationId situato nel build.gradle di file

Il secondo parametro è il percorso completo della classe con il suo pacchetto. per esempio: intentObj.setClassName ("applicatioId", "com.youCompany.yourAppName.YourClassName")

0

Utilizzare questo codice e non avrete problemi.

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

È possibile anche lanciare visualizzate in questa maniera. Prova questo

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

E al fine di utilizzare setClassName. Si dovrebbe fornirle packageName e il suo percorso di classe anche come

intent.setClassName("your.application.package.name", "your.application.package.name.activityClass"); 
Problemi correlati