2012-03-29 59 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");