【问题标题】:How to determine which child has called a parent’s method如何确定哪个孩子调用了父母的方法
【发布时间】:2014-10-07 18:44:25
【问题描述】:

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

【问题讨论】:

  • 我已将if(this instanceof DogActivity) 编辑并更改为if(!(this instanceof DogActivity)),以便人们了解instanceof 检查的重要性。
  • 我不确定我是否理解... DogActivityCatActivity 等应该是儿童班吗?还是它们只是随意的活动?

标签: java android android-activity android-actionbar


【解决方案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);
}

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

【讨论】:

    猜你喜欢
    • 2015-03-14
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2016-09-18
    • 2014-10-23
    • 2015-09-04
    • 2013-10-18
    相关资源
    最近更新 更多