【问题标题】:Referencing project object from library project从库项目中引用项目对象
【发布时间】:2011-05-25 14:28:52
【问题描述】:

我有一个我制作的游戏,它有 2 个版本。一个“精简”和一个“完整”。 为此,我将大部分代码放在一个库项目中。

问题是在部分代码中,我必须启动一个 Activity,其代码将在程序项目中,而不是在库中。 我发现它不会编译。

我解决这个问题的方法是为库项目中的活动创建一个虚拟类,但这可能不是正确的方法。

【问题讨论】:

    标签: android shared-libraries


    【解决方案1】:

    如果您说库项目的某些部分依赖于一个类,该类将在一个应用项目中具有一个实现,而在另一个应用项目中具有另一个或可能不存在的实现,那么我怀疑一个简单的接口会有所帮助。

    在库项目中声明一个接口,并将该项目中的所有引用更改为您的接口。在应用程序项目中,提供实现该接口的不同类,并根据它是精简版还是完整版来改变它们的行为。

    我看不出对 Activity 的依赖是如何表现出来的,因为在大多数情况下,您通过字符串引用 ComponentName 的 Activity。

    作为一个小例子,假设我们希望能够在精简版中将广告横幅图像视图注入到视图组中,但什么也不做,或者可能在完整版中隐藏视图组。

    在库项目中为 AdBannerProvider 声明一个接口:

    public interface AdBannerProvider
    {
        public void InjectAd(ViewGroup v);
    }
    

    在图书馆项目的活动中,可能需要广告,具体取决于点亮或完全,参考如下界面:

    private void getAdBanner(AdBannerProvider pProvider, ViewGroup pAdView)
    {
         pProvider.InjectAd(pAdView);
    }
    

    然后在 Lite 版本中,提供 AdBannerProvider 的实现,为该版本执行正确的操作:

    public class LiteAdBannerProviderImpl implements AdBannerProvider {
       @Override
       public void InjectAd(ViewGroup v) {
              // do something useful for the lite edition, like add an imageview to the passed viewgroup
       }
    }
    

    在完整版中,另一个班级为该版本做了正确的事情:

    public class FullAdBannerProviderImpl implements AdBannerProvider {
    
        @Override
        public void InjectAd(ViewGroup v) {
            // do something useful for the full edition, like maybe set the viewgroup to GONE or INVISIBLE
        }
    }
    

    【讨论】:

      【解决方案2】:

      应用程序项目应该依赖于库项目的组件/资源。如果需要从库中启动活动/服务,那么使用正确的组件集发布意图可能会起作用。

      Intent intent=new Intent();
      intent.setComponent(new ComponentName("com.pkg", "com.pkg.class"));
      startActivity(intent); 
      

      【讨论】:

        猜你喜欢
        • 2012-09-14
        • 2018-01-25
        • 2012-02-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2018-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多