2012-04-12 29 views
1

我使用下面的代碼移動到另一個活動的活動:啓動意圖和SetClassName

Intent intent = new Intent(); 
String test = "Navigate"; 
intent.setClassName(this.context,test); 
intent.putExtra("params", params); 
((Activity) context).startActivity(intent); 

但我無法啓動導航活動。沒有例外被拋出。 出於同樣的,如下因素代碼工作正常:

Intent intent = new Intent(this.context,Navigate.class); 
intent.putExtra("params", params); 
((Activity) context).startActivity(intent);  

請告訴我,如果任何解決辦法。

+1

解決了您的問題? – 2012-04-12 09:25:47

回答

3

您需要完整的類名,包括包:

String test = "your.package.here.Navigate"; 

(在清單中定義的活動,但你可以用Navigate.class啓動它我假設你已經做到了這一點)。

1

我會使用更明確的構造函數:Intent (Context packageContext, Class<?> cls)。從文檔:

[...]這提供了一種方便的方法來創建 爲了執行一個硬編碼的類名,而不是依靠 系統找到一個合適的類意圖你[...]

這個構造函數內部調用setComponent() - 方法,這也是由您使用setClassName() - 方法調用。但使用構造免去你的代碼行,使代碼更易讀:

Intent i = new Intent(this, Navigate.class); 
intent.putExtra("params", params); 
this.startActivity(i); 

注意,使用this只能這樣,在Activity時,由於活動的類繼承了Context -class。

將包和類名作爲String進行硬編碼的另一個優點是,當您將類移動到另一個包(或重命名包)時,您將得到編譯時錯誤,而不是運行時錯誤。

此外,爲此,您需要在Android Manifest中註冊活動。