如何在Intent构造函数中使用.class连接Java字符串?

时间:2014-07-03 22:40:22

标签: java android android-intent concatenation

我尝试创建一个带有按钮的菜单,这些按钮将根据相应的按钮ID(即Home1按钮,Home2按钮)启动活动类:

public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    switch (item.getItemId()) {
        case R.id.menu_home1:
            launchActivity("Home1");
            break;
        case R.id.menu_home2:
            launchActivity("Home2");
            break;
    }
    return super.onOptionsItemSelected(item);
}

public void launchActivity(String activityName) {
    Intent intent = new Intent(this, activityName + ".class");
    startActivity(intent);
}

但是,我得到了#34;无法解析构造函数"当试图构建一个意图。如何编写意图构造函数来动态构造新的活动参数?

2 个答案:

答案 0 :(得分:4)

您可以通过创建如下方法来执行您想要的操作:

private void startActivity(Class<?> cls) {
    Intent i = new Intent(this, cls);
    startActivity(i);
}

使用示例:

startActivity(MainActivity.class);

您正在使用要启动的实际类(Strings),而不是使用Activities

在您的代码中:

switch (item.getItemId()) {
    case R.id.menu_home1:
        startActivity(Home1.class);
        break;
    case R.id.menu_home2:
        startActivity(Home2.class);
        break;
}

答案 1 :(得分:0)

您正在尝试做的事情,即从名称移动到类对象,称为Java反射。

大多数时候你不需要它。一种更简单的调用活动的方法就是通过 意图是一个类对象:

Intent intent = new Intent(this, Home1.class);


但是,假设您了解自己的业务,并且需要通过字符串进行调用,这是正确的方法

public void launchActivity(String fullActivityName) {
    Intent intent = new Intent(this, Class.forName(fullActivityName));
    startActivity(intent);
}


请注意,这仅在fullActivityName包含完整类名时才有效 例如&#34; com.bla.bla.Home1&#34;