【问题标题】:Android Library ProjectAndroid 库项目
【发布时间】:2011-04-11 20:58:24
【问题描述】:

如何使用 Android 库项目,并覆盖“最终项目”中的某些类。

也就是说,我想引用一个库项目,同时,改变一些代码..

【问题讨论】:

    标签: android library-project


    【解决方案1】:

    可能并不完全是 Android 库项目的全部内容,但您可以通过使用 java 语言本身的接口和类继承特性来实现。

    库项目似乎可以很好地处理合并/覆盖来自子级父级的资源,并允许您使用一个具有不同应用程序包名称的代码库。

    鉴于您关于使用库项目拥有一个使用 AdMob 和一个不使用 AdMob 的应用版本的更新评论,我已经修改了这个答案...

    假设您不介意将 AdMob 库 (~138KB) 打包到您的完整版/付费版中,最简单的做法是扩展一个 Applcation 类,并在其中声明一个枚举和一个静态方法来决定是否应该使用 AdMob 广告被显示。

    public class Application extends android.app.Application
    {    
        public enum EditionType { LITE, FULL};      
        public static int getAdVisibilityForEdition(Context ctx)
        {
           if (EditionType.valueOf(ctx.getString(R.string.edition)) == EditionType.FULL)
           {
            return View.GONE;
           }
           return View.VISIBLE;
        }
    }
    

    您只需将此类添加到库项目中。在所有三个项目中,您都需要向 /res/Strings.xml 添加一个条目,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="edition">LITE</string>
    </resources>
    

    这个字符串在库项目中的值是什么无关紧要,但您可以在付费版本和广告支持版本中分别使用 FULL 和 LITE 来改变它。

    最后,为了让你的活动响应这些值,在你的 onCreate() 或 onResume() 中调用类似这样的东西:

    View ad = (View)this.findViewById(R.id.your_adMob_view_id)
    ad.setVisibility(Application.getAdVisibilityForEdition
                     (this.getApplicationContext()));
    

    这适用于 AdMob,因为如果视图不可见,AdMob 代码实际上不会尝试获取广告。

    如果您真的不想为 AdMob jar 提供额外的 138K 以及完整版所需的清单权限,有更优雅的方法可以做到这一点,但需要使用某种封装 AdMob 的东西和改变版本之间的 xml 布局(包括或不包括 AdMob 视图)或以编程方式将 AdMob 视图注入到布局中。

    希望对您有所帮助。

    【讨论】:

    • 如何使用“接口和类继承”(只是一个快速概述)...?
    • 嗯,它是所有面向对象语言中的一个中心概念,可能很难快速概述。您可以从 download.oracle.com/javase/tutorial/java/IandI/subclasses.html 开始,或者如果您可以举例说明您想做的事情,也许我们可以提供帮助。
    • 但是我不能引用库中的那些子类,因为它们只会存在于决赛中。
    • 尤其是扩展活动的类。它会导致并发症。
    • 也许您可以举例说明您希望能够在库项目中引用的内容,然后在依赖项目中覆盖/提供特定实现?根据它是什么,我怀疑使用接口会给你一种干净的方式让库中的类依赖它,但在特定项目中具有完全不同的实现。请给我一个你需要覆盖的想法,好吗?
    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2012-09-10
    相关资源
    最近更新 更多