【问题标题】:Extend Activity and ActivityGroup扩展 Activity 和 ActivityGroup
【发布时间】:2012-02-23 12:06:51
【问题描述】:

我正在编写一个应用程序,其中我有一组代码,我希望在我的所有活动和活动组中都可以使用这些代码。然而,为了实现这一目标,我将我的活动扩展为:

//custom Activity
public abstract class BaseActivity extends Activity
//custom ActivityGroup
public abstract class BaseActivityGroup extends ActivityGroup

//implemented activities in my app
public class PickUser extends BaseActivity
//and
public class Home extends BaseActivityGroup

现在的问题是,无论我在 BaseActivity 中编写什么自定义代码,我都必须在 BaseActivityGroup 中编写相同的代码(就像在当前实现中一样)。这很容易出现代码同步问题,我认为这不是一个好的技术。

那么,我怎样才能使我的扩展只在BaseActivity 中编写自定义代码,而我的BaseActivityGroup 扩展ActivityGroup - 这是从BaseActivity 类构思出来的?

如果我观察 android 是如何做到这一点的,那么 android 中的 ActivityGroup 扩展了 Activity 类。而且我还想编写我的自定义 ActivityGroup 类(称为 BaseActivityGroup),它实际上扩展了 BaseActivity(这是一个扩展的 Activity)。

有什么想法/建议吗?

【问题讨论】:

    标签: android inheritance android-activity extends activitygroup


    【解决方案1】:

    首先,ActivityGroup 不好,不应该使用。它们已被弃用,最好使用具有多个片段的单个活动。

    如果您必须使用活动组,您可能最好通过实现委托模式来实现。

    创建一个处理所有常用方法(如 onCreate、onResume)的委托并在基础中使用它们。在此示例中,我在委托中保存了对活动的引用。这个循环引用可能不是漂亮的。另一种方法是将活动传递给委托中的方法。

    public class ActivityDelegate() {
        private Activity mActivity;
    
        public ActivityDelegate(final Activity activity) {
            mActivity = activity;
        }
        public void onCreate(final Bundle savedInstanceState) {
            // Do stuff.
        }
    }
    
    
    public abstract class BaseActivity extends Activity {
        private ActivityDelegate mDelegate = new ActivityDelegate(this);
    
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mDelegate.onCreate(savedInstanceState);
        }
        ...
    }
    
    public abstract class BaseActivityGroup extends ActivityGroup {
        private ActivityDelegate mDelegate = new ActivityDelegate(this);
    
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mDelegate.onCreate(savedInstanceState);
        }
        ...
    }
    

    【讨论】:

    • 但我也需要访问活动方法,我无法在 ActivityDelegate 类中获得这些方法。不是吗?
    • 我编辑了示例,因此将活动保存为委托中的引用。然后你可以回调你需要的所有常用的Activity方法。
    • 但是如何处理活动生命周期?我的意思是您的实现中缺少super.onCreate(savedInstanceState);。如何解决这个问题?
    • 我的示例不是完整的实现,但我对其进行了一些更新。您仍然必须在 BaseActivity 和 BaseActivityGroup 中调用 super.onCreate(savedInstanceState) 和类似方法,因为它们受到保护,因此不能从委托中调用。这似乎是一个很小的代价,因为无论如何你都应该这样做。
    • hmmm,这种方法看起来像个 hack,但效果很好。为了同步基类中的方法和它们在委托类中的调用,我引入了一个由基类和委托类实现的接口。无论如何,感谢您提供另一种处理方式
    【解决方案2】:

    添加一个额外的最终类,称为 Base。 这个只包含要被其他基类调用的方法,例如:

    public static boolean createOptionsMenu(final Menu menu,
            final MenuInflater inflater) {
        inflater.inflate(R.menu.main_menu, menu);
        return true;
    }
    

    然后,在您的 BaseActivity 和 BaseActivityGroup 类中,您将调用:

    @Override
    public final boolean onCreateOptionsMenu(final Menu menu) {
        return Base.createOptionsMenu(menu, getMenuInflater());
    }
    

    希望对你有帮助!

    【讨论】:

    • 其实我不需要静态方法。我已经编写了自定义方法来在我的基类中提供简单的服务绑定真实会话更新和一些广播收听,这些对使用这些至关重要在类文件中
    【解决方案3】:

    只需将所有内容扩展到 BaseActivity,包括 BaseGroupActivity,因为所有内容都是 android 中 Activity 的子项

    【讨论】:

    • 如果我将所有内容都扩展到 BaseActivity 那么我所有的类都将是 Activity 的实例,而这不是我想要的,因为我需要 ActivityGroup 太
    【解决方案4】:

    您可以将您的登录信息放在一个方法下的单独文件中。如果您需要文件中的活动实例,现在从BaseActivityBaseActivityGroup 调用相同的方法。通过构造函数传递上下文

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 2012-12-28
      相关资源
      最近更新 更多