我正在尝试构建一个复杂的表单,其中几乎所有元素都是可选的。它从一个字段和一个“添加元素”按钮开始。单击“添加”时,表单会显示可添加到表单中的Spinner
个元素类型(位置,照片,详细注释,“现在”以外的时间戳等)。当您选择一个项目时,它会启动一个Activity
,每个项目都有不同的关联Activity
。
此外,每个选项都会有几位数据,以某种方式“存储”Activity
会很好:
Spinner
我正在考虑一组扩展抽象FormElement
类的类,并且每个上面的额外数据都有静态元素。 (此解决方案的另一个障碍是在静态上下文中有多少痛苦Resources
。)
如何使其尽可能干净和可维护?我真的不喜欢编辑五个不同的文件来为这个表单添加一种新类型的元素。 (主要是因为我可以保证我会错过一个并且花费数小时追逐unbugs。)
答案 0 :(得分:1)
一些提示......
单元测试会阻止“unbugs”:)
当每个Activity
从用户那里获得所需信息时,请使用包含每种类型数据的Intent
来调用Activity#setResult()。 Intent
支持所有Bundle
方法,因此您可以根据需要设置不同类型的数据。
要支持#2,请确保您使用Activity#startActivityForResult(Intent,int)
启动它,并在Activity#onActivityResult(int,Intent)
我可能会维护可用的“元素”类型列表,以便与SpinnerAdapter
一起使用(例如ArrayList<Class<? extends AbstractFormElement>>
,并调用静态方法,如.getDisplayName()
,{{1在Adapter的.getActivityClass()
方法中,等等,以确定要显示的内容和要启动的Activity。
通过这种方式,您的列表实际上会包含getView()
)等内容。
将每个元素添加到表单后,将其添加到{ MyPhotoElement.class, MyTextElement.class, MyDateElement.class, ...}
,该ArrayList<AbstractFormElement>
将用于支持ListView
的另一个适配器。该适配器将调度自定义视图布局的膨胀,以及基于它是什么类型的对象创建ViewHolder - 这将要求每个不同的AbstractFormElement
都有自己的“视图类型”,根据适配器。请参阅BaseAdapter#getItemViewType(int)和相关的getViewTypeCount()
。
值得注意的是,如果一个人无法转换为另一个,那么这些将需要不同的视图类型 ...例如,如果你有两个“元素”,只需要显示一个字符串列表中的文本,它们都可以共享“纯文本”视图类型。同样地,仅显示照片的两个元素,或者可以容易地将一个元素转换为另一个元素(例如,具有标题的图标,相对于没有标题的照片缩略图),可以共享单个“图像加字幕”视图类型。
考虑到上述情况,你实际上最终不得不修改不同的文件来添加一个新类型(好吧,从技术上讲,你可以将它们全部放在一个文件中,作为内部类,但实际上没有好的论据这样做,但如果你已经正确完成了你的接口API,并遵循良好的面向对象实践,并实现了良好的单元测试,你将大大减少查找错误所需的工作量 - 仅仅因为涉及的大多数事情如果不正确地添加新类型实际上会强制编译器错误。除此之外,正确的单元测试套件将能够以编程方式添加所有可能的类型,并确保一切正常显示,并且您应该有一个非常简化的流程,以便于扩展:)
这听起来像很多工作,一开始可能看起来很乏味和冗长......但最终结果实际上更易于维护,特别是如果你的元素类型列表相当广泛的话。