2016-12-20 4 views
2

は、あなたが文字列を持っているとしましょう:のAndroid Studioで、クラス名として「動的」の文字列を渡す

String string_name; //assign whatever value 

そして、あなたが意図を持っている:これは明らかに動作しません

Intent i = new Intent(getApplicationContext(), string_name.class); 

。 ASは文字列名をクラスとして認識しません(ただし、ITフォルダーはメインフォルダー内のアクティビティーとして存在します)。 fornameメソッドは私のためにも機能しませんでした(私が間違っていない限り)。

私はname1、name2、name3などに記載されている10のアクティビティ/クラスを持っています。そして、それぞれのアクティビティを終えた後、プログラムは「遷移」アクティビティページに行き、次のアクティビティにリダイレクトします。実行時間。ユーザーがname1アクティビティを実行すると、プログラムは彼を「遷移」ページにリダイレクトします。その後、私はname2アクティビティにそれらを送信しようとしています。等々。

"Transition"アクティビティ/クラスのname1、name2、activitiesの名前を文字列(この場合はstring_name)に割り当てます。数行のコードの後に​​、name1の名前を取得し、name2に変更して文字列に格納しました。しかし、Android Studioはクラス値として「動的」文字列を受け入れません。

思考?更新

答えて

0

あなたはStringからクラスを取得するためにClass.forName(String string_name)を使用することができます。しかし、Stringでは完全なパッケージ名をclassにしなければなりません。

String string_name = "com.your_package.TestActivity"; 
    try { 
     Class<?> classByName = Class.forName(string_name); 
     Intent i = new Intent(this, classByName.class); 
    } catch (ClassNotFoundException e) { 
     Log.e("YourParentClassName", "System can't find class with given name: " + string_name); 
    } 
+0

にClass.forName(string_name)はまだ赤い下線が引かれていると、 "未処理の例外は:java.lang.ClassNotFoundExceptionが" 言う –

+1

あなたはのtry-catchにあなたのコードを入れて、この問題解決することができます:=「com.your_package 文字列string_nameを。 TestActivity "; try { クラス classByName = Class.forName(string_name); インテントi =新しいインテント(this、classByName.class); } catch(ClassNotFoundException e){ Log.e( "YourParentClassName"、 "システムは指定された名前のクラスを見つけることができません:" + string_name); } – Gaket

+0

を使用してください。try catch @master_of_privates –

0

それはこのスニペットはあなたを助けるべきであるように見える。これの代わりに

String string_name = "com.package.ActivityToStart"; 
Intent i = null; 
try { 
    i = new Intent(this, (Class<?>) Class.forName(string_name).newInstance()); 
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { 
    Log.e("YourParentClassName", "System can't find class with given name: " + string_name, e); 
} 
if (i != null) { 
    // do your work 
} 
+0

これは実際にそれを開始することができましたが、その意図はその仕事をしていません。 P.S.最後のif節であなたの仕事をどういう意味ですか? –

+0

インテント(この場合「i」)がnullでない場合にのみ、このインテント(アクティビティの開始など)で操作する必要があります。そこで、次のコードを記述する必要があります。 _i_がデバッガまたはロギングを使用していることを確認しましたか? 「意図はそれをやっていない」とはどういう意味ですか? – Gaket

+0

私はこのコードを試したことを意味し、プログラムは最終的には管理を開始しますが、例外コードはすべて実行されます。 startActivity(i);まだ次のアクティビティーに行きません –

0

Intent i = new Intent(); 
// Set the component using a String 
i.setClassName(getApplicationContext(), string_name); 

注:

Intent i = new Intent(getApplicationContext(), string_name.class); 

あなたがこれを行うことができていることを確認しますあなたの活動のすべてがあなたのマニフェストで宣言されていること。

+1

ありがとう!これがやっと働いた!これはなぜ以前のものがしなかったのか説明していただけますか? –

+0

@master_of_privates 'string_name'はクラス' String'のインスタンスなので、 'string_name.class'は' Activity'ではない 'String'クラスを返します。特定の 'Activity'に関連する' Class'オブジェクトを取得する必要があります。これは 'Class.forName(string_name)'を使って行うこともできます。 –