如何确定哪个孩子调用了父方法

时间:2014-10-07 18:44:26

标签: java android android-activity android-actionbar

我在多个活动中使用相同的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不兼容。感谢您提供的任何帮助。

1 个答案:

答案 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);
}

如果我误解了这个问题,请告诉我。无论哪种方式,您都可以修改此方法以适合您的用例。