2012-03-29 35 views
7

开始新的意图我要动态地开始新的意图。因此setClassName似乎是最好的选择。不能由setClassName不同封装的Android

首先,我定义清单

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

3活动从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); 

而且会得到这个异常:

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

看起来我们只能用setClassName动态地启动新的活动,但在同一个包中。

任何想法来解决这个问题?所有的帮助表示赞赏。

+0

'<活动机器人:名字= “com.example.pkg1.Act1”/>'变化ACT1 ACT2到您已声明ACT1 2次? – 2012-03-29 10:58:37

+0

谢谢@imrankhan这是我的错,当复制粘贴:p – anticafe 2012-03-29 11:02:28

+0

没关系,看到我更新的答案。 – 2012-03-29 11:03:35

回答

12

setClassName采取包上下文作为第一个参数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); 
} 

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

或尝试这个:

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

对不起,它不起作用。同样的错误:-s – anticafe 2012-03-29 10:39:19

0

按照语法来写setClassName()方法:

setClassName(pkgName, className) 
+0

谢谢你的回答,但它不起作用。 – anticafe 2012-03-29 10:40:00

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

您可以用下面的方法在包装方面创造的意图:你保持通用代码

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

这样。

HTH

0

intent.setClassName(packageName,className);

其中
packageName - 实现所需组件的包的名称,即调用者所属的包。
的className - 类[从不同的包]

com.example.pkg2.Act调用的全限定名:

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

第一param是的applicationID位于所述的build.gradle文件

第二参数是与包装中的类全路径。 例如: intentObj.setClassName( “applicatioId”, “com.youCompany.yourAppName.YourClassName”)

0

使用此代码,你会没事的。

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

您也可以通过这种方式启动活动。试试这个

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

而且为了使用setClassName。你应该的packageName和它的类路径供应太像

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