我在多个活动中使用相同的tabBar。由于onOptionsItemSelected
涉及广泛的逻辑,我想编写一次相关的方法,然后重用它们。因此,我决定创建一个名为CustomActionBarActivity
的超类,然后让子活动扩展它。我需要帮助的一个特殊问题是如何判断哪个孩子导致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不兼容。感谢您提供的任何帮助。
答案 0 :(得分:1)
不是让你的父类使用反射来检查孩子(这是非常脆弱的,因为它不会随着你创建的子类的数量而缩放),也许你可以利用动态调度来代替。
例如,您可以在父活动中声明abstract
方法,例如:
protected abstract void onTabItemSelected(MenuItem item);
然后,您的子活动可以根据所需的行为覆盖此方法。例如,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);
}
如果我误解了这个问题,请告诉我。无论哪种方式,您都可以修改此方法以适合您的用例。