[英]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.