我在多个 Activity 中使用相同的 tabBar。由于 onOptionsItemSelected
涉及大量逻辑,因此我想编写一次相关方法,然后重用它们。因此,我决定创建一个名为 CustomActionBarActivity
的父类(super class),然后让子 Activity 扩展它。我需要帮助解决的一个特殊问题是如何判断是哪个子项导致 onOptionsItemSelected
被调用?为了阐明,我将介绍一般代码,然后尝试解决方案失败。
这里是通用代码
public class CustomActionBarActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.tab_dog:
startActivity(new Intent(this, DogActivity.class));
return true;
case R.id.tab_cat:
startActivity(new Intent(this, CatActivity.class));
return true;
case R.id.tab_mouse:
startActivity(new Intent(this, MouseActivity.class));
return true;
case R.id.tab_goose:
startActivity(new Intent(this, GooseActivity.class));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
尝试失败
如果我尝试,例如,
case R.id.tab_dog:
if(!(this instanceof DogActivity))
startActivity(new Intent(this, DogActivity.class));
然后我得到一个编译错误,例如 CustomActionBarActivity 与 DogActivity 不兼容。感谢您提供的任何帮助。
最佳答案
与其让您的父类使用反射检查子类(这是非常脆弱的,因为它不会随着您创建的子类的数量而扩展),也许您可以利用动态调度。
例如,您可以在父 Activity 中声明一个抽象
方法,例如:
protected abstract void onTabItemSelected(MenuItem item);
然后您的子 Activity 可以根据所需的行为覆盖此方法。例如,DogActivity
可能会像这样实现它:
protected boolean onTabItemSelected(MenuItem item) {
if (item.getItemId() != R.id.dog_tab) {
startActivity(new Intent(this, DogActivity.class));
return true;
}
return false;
}
onOptionsItemSelected
方法将像这样实现:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (onTabItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
如果我误解了这个问题,请告诉我。无论哪种方式,您都可以修改此方法以适合您的用例。
关于java - 如何判断哪个子进程调用了父进程的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26243010/