我正在关注 Android 开发的 newboston 教程,我想知道是否有一个快速的解决方案来显示字符串值,而不需要它们与它们的类或 Activity 名称相同,即字符串名称“SystemActivity”必须相同为其工作的 Activity 名称。问题是它在模拟器 UI 上显示为“SystemActivity”,我宁愿给它一个更合适的名称......“启动系统”。
如果有任何帮助,我将不胜感激...
这是我的代码:
String classes [] = {"SystemActivity","DietTips","About"};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(Menu.this, android.R.layout.simple_list_item_1, classes));
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
String link = classes [position];
try{
Class ourClass = Class.forName("com.example.system." + link);
Intent ourIntent = new Intent(Menu.this, ourClass);
startActivity(ourIntent);
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}
}
最佳答案
好吧,我建议您跳过本教程,因为它显示了一种不好的做法。您很少需要通过名称来查找类,但在这种情况下您不应该这样做。一个简单的拼写错误,您的应用程序就无法运行。
您应该将代码修改为基于具有名称和类型的索引或包装对象。基于索引的方法将产生比当前方法更少的错误,并且包装器对象应该 100% 正确工作。
基于索引:
onListItemClick(...., int position...){
Intent i;
switch(position){
case 0:
//SystemActivity
i = new Intent(Menu.this, SystemActivity.class);
break;
//other cases
}
startActivity(i);
}
基于包装:
public class Wrapper<T> {
String name;
Class<T> type;
public Wrapper(String n, Class<T> t){
name =n;
type = t;
}
String toString(){return name};
}
//Then pass these objects to your array adapter:
Wrapper wrapper1= new Wrapper("Start System",SystemActivity.class);
...
Wrapper[] wrappers = {wrapper1,wrapper2..}
setListAdapter(new ArrayAdapter<Wrapper>(...,wrappers,..));
onListItemClick(...){
Wrapper clicked = wrappers[position];
Intent i = new Intent(Menu.this, clicked.type);
startActivity(i);
}
关于java - newboston Android开发教程-显示列表菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25286390/