繁体   English   中英

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

[英]How to concat Java string with .class in Intent constructor?

我正在尝试创建一个带有按钮的菜单,这些菜单将根据给定的按钮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);
}

但是,尝试构造意图时,出现“无法解析构造函数”。 如何编写意图构造器以动态构造新的活动参数?

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

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

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

大多数时候,您将不需要它。 调用活动的一种更简单的方法是将意图传递给类对象:

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


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

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


请注意,这仅在fullActivityName包含完整的类名(例如“ com.bla.bla.Home1”)时才有效。


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM