【问题标题】:How to avoid a circular reference between projects?如何避免项目之间的循环引用?
【发布时间】:2015-12-21 11:23:28
【问题描述】:

我有一个 android 应用程序项目,它也有一些 android 库项目。每个图书馆项目都有自己的活动和资源。我已经实现了NavigationDrawer 并希望在所有活动中都使用它,所以我创建了一个具有抽屉的基础项目(android 库项目)(按照此答案中的指南:Same Navigation Drawer in different Activities)。然后的想法是每个子项目(android库项目)将从基础扩展,但此时我遇到了循环引用问题。

我的结构与这张图片上的相似:

让子项目中的每个活动都从基础库扩展没有问题,但问题是基础库也需要知道活动(因此循环引用),以便我可以处理点击NavigationDrawer,类似的东西:

mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        switch (position) {
            case 0:
                Intent intent = new Intent(this, SubProjectOneActivityOne.class);
                startActivity(intent);
                finish();
                break;
            case 1:
                Intent intent1 = new Intent(this, SubProjectOneActivityTwo.class);
                startActivity(intent1);
                break;
            case 2:
                Intent intent2 = new Intent(this, SubProjectTwoActivityOne.class);
                startActivity(intent2);
                break;
            default:
                break;
    }
}});

所以目前我用这种方法遇到了死胡同。是否可以在子项目中重载点击事件?有人有其他建议吗?

【问题讨论】:

  • 我已经通过提供router 对象来处理这个问题。基础项目可以公开它,并且每个其他模块都可以注册一个路由。这些路由可以执行可能会或可能不会启动活动的操作。
  • @daentech 你能分享更多信息和可能的代码吗?
  • 这里有一些示例代码。我希望它可以编译,但我删除了一些不必要的代码。您可以将您的路线命名为基础项目中的常量,并可能在其他项目中引用它们吗? gist.github.com/daentech/f372f3a6529d08979f1c 这也可以使用/route/&lt;variable&gt; 处理通配符路由,并将意图中的数据作为getData() 传递
  • @daentech TransitionUtils 是什么?
  • 抱歉,如果您刷新它,我已将其删除。我有一些静态助手来管理活动之间的动画转换

标签: android android-activity android-library


【解决方案1】:

我已经使用路由机制解决了这个问题(以及其他几个问题)。

我的解决方案是这样的:
https://gist.github.com/daentech/f372f3a6529d08979f1c

它将允许您根据字符串名称添加路由,并通过打开这些命名路由来启动活动或回调。

您的基础项目可以共享其他项目可以注入的单例路由器对象。这些子项目中的每一个都可以将它们的路由添加到路由器,而基础项目不需要知道这些路由的作用,只需要知道它们的名称。

您也可以使用通配符路由,但我计划在某个时候更新它以处理路由变量并允许 URL。

使用类似这样的路由的好处是您可以处理从应用程序中的任何位置到其他任何位置的路由,甚至是从被点击的通知之类的东西。

【讨论】:

  • 我不确定我是否能理解如何使用它。我已将ApplicationRouter 和接口添加到基础库,但SyncStateContract.Constants.ACTIVITY_PATH 出现错误。然后我不确定如何在其他项目中使用它。你能详细说明一下吗?
  • 您的其他项目都是库模块吗?在 Android Studio 中?
  • 一个是主应用,其他都是库模块,包括基础库。
  • 每个库都有对基础库的引用吗?
  • 是的,但是如果应该以其他方式引用它们,我可以更改引用。
猜你喜欢
  • 2020-05-25
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多