如何在项目中重新定义库功能?

时间:2014-07-14 13:04:59

标签: android android-library

我有实现大多数应用程序功能的库项目,它就像一个应用程序模板。使用此库的每个项目都可以重新定义一些资源,主题等。主要案例是获取信息的颜色和网址,此应用程序将显示。但重新定义一些代码更成问题。例如,有一个视图显示来自xml的信息,但xml是不同的,我需要以不同的方式解析它。我目前的认识是这样的。

public class MyView extends LinearLayout {

    public setData(XmlData xml) {
         //call to helpers static method to get parsed data from xml
         ArrayList<Item> items = ParseHelper.getItems(xml);
    }

}

所以我需要的只是改变ParseHelper中的一些逻辑。现在我只看到一种方法,重新定义layout.xml以将MyView更改为ProjectMyView,我将更改方法setData以使用另一个ParseHelper。但这并不好。

也许有一些模式或其他方法来解决这个问题?

我认为使用库或项目中不同类的另一种方法是使用reflaction。例如,项目中的包只有名称(com.library.helpers和com.project.helpers)不同,并检查项目中的类,如果存在则使用它,如果没有使用库。但我认为它会使用很多资源。

有人可以分享他们的经历吗?

1 个答案:

答案 0 :(得分:1)

您可以将MyView设为抽象,并让setData作为未实现的方法,并强制所有子类实现此方法,如下所示:

public abstract class MyAbstractView extends LinearLayout {
    public abstract setData(XmlData xml);
}

他们,你的库有一个扩展MyAbstractView的类,其最常用的实现是这样的:

public class MyView extends MyAbstractView {
    public setData(XmlData xml) {
        //call to helpers static method to get parsed data from xml
        ArrayList<Item> items = ParseHelper.getItems(xml);
    }
}

对于那些想要不同实现的人,他们只需要扩展MyAbstractView

最后,调用者或这些对象只需要执行以下操作:

public void init(MyAbstractView arg, XmlData xml) {
    arg.setData(xml);
}