java - 如何判断哪个子进程调用了父进程的方法

标签 java android android-activity android-actionbar

我在多个 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/

相关文章:

android - Web 浏览器应用程序 - 如何拦截 URL Intent ?

java - 这个 JPanel 代码好吗?单击按钮时不显示其他 JPanel

java - 空指针警告 - BatteryManager.EXTRA_LEVEL

android - Windows 开发人员查看 Android 框架源代码的简便方法?

Android:LinearView,左右固定大小的小部件,中间有一个灵活的小部件

android - Intent - startActivityForResult

java - 如何修复丢失 token 错误

java - Logback 的调试输出未显示

java - fragment 中的空回收器 View

scrollview - 索尼平板电脑键盘弹出问题