1

次のコードを使用して、別の Activity に移動しています。

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

回避策があれば教えてください。

4

2 に答える 2

3

パッケージを含む完全なクラス名が必要です。

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

(そしてマニフェストで定義されたアクティビティですが、最初から始めることができるので、Navigate.classすでにこれを行っていると思います)。

于 2012-04-12T09:15:57.623 に答える
1

より明示的なコンストラクターを使用します: Intent (Context packageContext, Class<?> cls). ドキュメントから:

[...]これにより、システムに依存して適切なクラスを見つけるのではなく、ハードコーディングされたクラス名を実行することを目的としたインテントを作成する便利な方法が提供されます[...]

このコンストラクターは内部的にsetComponent()-method を呼び出します。これは、使用した -method によっても呼び出されますsetClassName()。ただし、コンストラクターを使用すると、コード行が節約され、コードが読みやすくなります。

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

activity-class は -class を拡張するため、 usingthisは の場合にのみこの方法で機能することに注意してください。ActivityContext

パッケージ名とクラス名を String としてハードコーディングすることに対するもう 1 つの利点は、クラスを別のパッケージに移動する (またはパッケージの名前を変更する) ときに、実行時エラーではなくコンパイル時エラーが発生することです。

また、これを機能させるには、Activity を Android マニフェストに登録する必要があります。

于 2012-04-12T09:25:56.553 に答える