通过String启动获取类的新活动

时间:2013-04-26 20:29:30

标签: android android-intent android-activity

我有一个DB,其类名称为多个Activity,例如:

Activity1Name.class
Activity2Name.class
Activity3Name.class

这种方法

public startNewActivity(String activityName){
   Intent myActivity = new Intent(CurrentClass.this, activityName);
                startActivity(myActivity);
}

显然不起作用,因为意图

   Intent myActivity = new Intent(CurrentClass.this, activityName);

需要一个类,而不是具有类名的String

我怎样才能通过String activityName获取类?

我想避免声明太多的意图,只使用运行时需要的Intent。

4 个答案:

答案 0 :(得分:3)

Class<?> clazz = Class.forName("yourPackage.YourActivityName");   

Intent myActivity = new Intent(CurrentClass.this, clazz);

示例:

Class <?> clazz = Class.forName("com.test.testActivity");

答案 1 :(得分:1)

  

我怎样才能通过String activityName获取类?

我认为你需要这样的东西:

Class<?> target = Class.forName(<yourPackage>.ActivityName);
Intent i = new Intent(Caller.this, target);

在您的情况下,您需要从数据库字符串从0到点位置。

<强>的伪代码:

String stringFromDb = "Activity1Name.class";
int i = stringFromDb.lastIndexOf(".");
String actName = stringFromDb.subString(0, i);
Class<?> target = Class.forName(<package> + "." + actName); // getPackageName()
Intent i = new Intent(Caller.this, target);

答案 2 :(得分:0)

您可以使用反射加载类,例如:

public startNewActivity(String activityName){
   try {
       Class<?> clazz = Class.forName(getPackageName() +"." +activityName);

       Intent myActivity = new Intent(CurrentClass.this, clazz);
       startActivity(myActivity);

   } catch (Exception e) {
       Log.e("TAG","Error: " +e.getStackTrace());
   }
}

如果您提供完整的班级名称(包括包裹名称),则不需要getPackageName()来电。

希望这有帮助..干杯!

答案 3 :(得分:0)

只需将字符串转换为活动名称即可。 This回答可能是您的问题解决方案。希望这会有所帮助。