假设我有多个正在运行的活动; A,B和C.每个共享一个类似的选项菜单,其执行有一些差异(“开始”选项在活动A中可能与B略有不同)。我还有一个名为“values”的静态类,它与活动A相关联。它还具有当前运行活动的上下文。
有时,值可能会调用当前运行活动的optionsmenu中的项目。我的代码很乱(见下文),所以我想把它组织成一个更易读的形式。
我的目标是设置值,使其只能调用当前运行活动的函数,而不是该活动的optionmenu项。在活动内部,optionsmenu的一个项目只是调用一个函数而不是代码内部的代码(出于组织原因)。
这里是一个values.class的示例,它调用当前运行活动的optionsmenu的项目。
public void startExample() {
Runnable startRun = new Runnable() {
@Override
public void run() {
handler.post(new Runnable() { // This thread runs in the
// UI
@Override
public void run() {
((Activity) getCurrentContext()).openOptionsMenu();
((Activity) getCurrentContext()).closeOptionsMenu();
((Activity) getCurrentContext()).onOptionsItemSelected(theMenu.findItem(R.id.start));
}
});
}
};
new Thread(startRun).start();
}
如您所见,values.startExample()会调用当前运行活动的选项菜单的开始项。我想改变它,以便它根据当前的运行活动调用一个函数。所以我认为我可以做这样的事情。
在values.class
中ActivityB b = new ActivityB
public void startExample() {
Runnable startRun = new Runnable() {
@Override
public void run() {
handler.post(new Runnable() { // This thread runs in the
// UI
@Override
public void run() {
if( ((Activity) getCurrentContext()).getClass().getName().equals("package.ActivityB") ) {
b.start();
}
}
});
}
};
new Thread(startRun).start();
}
活动B可能看起来像。
public class ActivityB extends Activity {
//class code here
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case start:
this.start();
break;
}
}
public void start() {
//code here
}
}
这可能吗?我知道这个问题可能听起来令人困惑,所以请提出问题,我可能会再次简化它。
答案 0 :(得分:1)
不不不不不。这就像拉扯撬棍到Android并将其粉碎成碎片。活动并不意味着通过new
实例化。
如果你想要的是在不同的活动在onOptionsItemSelected()中调用的方法之间存在一些共享行为,那么要么在你在特定的子类中添加你想要的任何行为之前创建一个超级活动并调用super。或者创建一个可以访问包含不变更的内容的所有活动的函数,然后添加子类内部更改的内容。无论哪种方式,活动都是通过在startActivity等中提供对类的引用来运行的。您不能将Activity视为普通的java对象(即使它最终是),因为它的生命周期是由系统。