前段时间做项目,一个项目中包含几十个activity,这些activity数目会有一些变化或者扩展,需要通过一个固定的菜单调用,activity之间也会按顺序的互相调用。需要一种机制,能够实现根据activity的个数生成菜单,当activity个数变化时,菜单个数也跟着变化,并且菜单能够和相应的activity对应,并且activity之间也可以按顺充调用,比如a调用b,b调用c,c调用d,当b不再起作用时,a能直接略过b而调用c。这如果是使用C语言,把所有的窗口直接使用函数指针数组,可以很方便实现,可惜的是java中没有指针。最后使用反射予以实现。创建一个application类,在该类中定义包含所有activity类名字字符串的数组。最后完美解决。代码如下:
publicclasshardwareAppTest extendsApplication
{
//privatestatic List<Activity> activityList = newLinkedList<Activity>();
publicString[] a= newString[] {"com.magcomm.newhardware40.TPActivityTest",
"com.magcomm.newhardware40.LCDActivityTest",
"com.magcomm.newhardware40.BacklightActivityTest",
"com.magcomm.newhardware40.FrontCamActivityTest",
"com.magcomm.newhardware40.BackCamActivityTest",
"com.magcomm.newhardware40.FlashlightActivityTest",
"com.magcomm.newhardware40.WifiActivityTest",
"com.magcomm.newhardware40.BTActivityTest",
"com.magcomm.newhardware40.FmActivityTest",
"com.magcomm.newhardware40.SensorActivityTest",
"com.magcomm.newhardware40.ReceiveActivityTest",
"com.magcomm.newhardware40.SpkActivityTest",
"com.magcomm.newhardware40.MotoActivityTest",
"com.magcomm.newhardware40.EarphoneActivityTest",
"com.magcomm.newhardware40.SIMActivityTest",
"com.magcomm.newhardware40.TcardActivityTest",
"com.magcomm.newhardware40.LightSersorActivityTest"
};
publicList<String> activityList= Arrays.asList(a);//newArrayList();
@Override
publicvoidonConfigurationChanged(Configuration newConfig) {
//TODOAuto-generated method stub
super.onConfigurationChanged(newConfig);
}
@Override
publicvoidonCreate() {
//TODOAuto-generated method stub
super.onCreate();
}
publicbooleanonOptionsItemSelected(MenuItem item, Class<?> cls, Context c) {
Stringcur_name = cls.getName();
intindex = activityList.indexOf(cur_name);
Classcls1 = null;
Stringstr;
Log.i("BBBBBBBB","XXXXXXX, index ="+index);
Log.i("BBBBBBBB","XXXXXXX, cur_name ="+cur_name);
Log.i("BBBBBBBB","XXXXXXX, item.getItemId()="+item.getItemId());
switch(item.getItemId()) {
case1:
break;
case2:
break;
case3:
str= activityList.get(index-1);
Log.i("BBBBBBBB","XXXXXXX, str ="+str);
//str= str.substring(str.lastIndexOf(".")+1, str.length());
Log.i("BBBBBBBB","YYY, str ="+str);
try{
cls1= Class.forName(str);
}catch(ClassNotFoundException e) {
//TODOAuto-generated catch block
Log.i("hardwareAppTest",str+" activity not find!");
e.printStackTrace();
}
break;
case4:
str= activityList.get(index+1);
Log.i("BBBBBBBB","ZZZZ, str ="+str);
//str= str.substring(str.lastIndexOf(".")+1, str.length());
Log.i("BBBBBBBB","NNNN, str ="+str);
try{
cls1= Class.forName(str);
}catch(ClassNotFoundException e) {
//TODOAuto-generated catch block
Log.i("hardwareAppTest",str+" activity not find!");
e.printStackTrace();
}
break;
case5:
break;
case6:
break;
default:
str= activityList.get(index-3);
Log.i("BBBBBBBB","ZZZZ, str ="+str);
//str= str.substring(str.lastIndexOf(".")+1, str.length());
Log.i("BBBBBBBB","NNNN, str ="+str);
try{
cls1= Class.forName(str);
}catch(ClassNotFoundException e) {
//TODOAuto-generated catch block
Log.i("hardwareAppTest",str+" activity not find!");
e.printStackTrace();
}
break;
}
//cls.newInstance();
Log.i("BBBBBBBB","XXXXXXX, cls1 ="+cls1.getName());
IntentmIntent = newIntent();
mIntent.setClass(c,cls1);
c.startActivity(mIntent);
//返回true表示处理完菜单项的事件,不需要将该事件继续传播下去了
returntrue;
}
}