1

我正在尝试构建一个复杂的表单,其中几乎所有元素都是可选的。它从一个字段和一个“添加元素”按钮开始。当您单击添加时,表单会显示Spinner您可以添加到表单中的元素类型(位置、照片、详细说明、“现在”以外的时间戳等)。当您选择一个项目时,它将启动一个Activity,并且每个项目都有一个不同的关联Activity

此外,每个选项都会有几位数据,以Activity某种方式“与”一起存储会很好:

  • 图标和显示的名称Spinner
  • 用于将数据存储在数据库中的密钥(以及传递给 Web 服务)
  • 如何在原始表单上显示结果的布局(即照片的缩略图、位置的纬度/经度等)

我正在考虑一组类,它们都扩展了一个抽象FormElement类,并且对于上述每个额外的数据都有静态元素。Resources(这个解决方案的另一个问题是在静态环境中有多少痛苦。)

我怎样才能使它尽可能干净和可维护?我真的不喜欢编辑五个不同的文件来为这个表单添加一种新类型的元素。(主要是因为我可以保证我会错过一个并花几个小时追查 unbugs。)

4

1 回答 1

1

一些提示...

  1. 单元测试将防止“unbugs”:)

  2. 当每个Activity人都从用户那里获得了它需要的信息时,调用Activity#setResult()并使用Intent包含您的每种类型的数据。 Intent支持所有Bundle方法,因此您可以根据需要设置不同类型的数据。

  3. 要支持 #2,请确保您正在使用Activity#startActivityForResult(Intent,int)启动它,并在Activity#onActivityResult(int,Intent)

  4. 我可能会维护可用的“元素”类型列表,以便在适配器的方法中与SpinnerAdapter(例如,ArrayList<Class<? extends AbstractFormElement>>和调用静态方法,如.getDisplayName(),,.getActivityClass()等)一起使用getView(),以确定要显示的内容和要启动的活动。

    这样,您的列表实际上将包含类似{ MyPhotoElement.class, MyTextElement.class, MyDateElement.class, ...}) 的内容。

  5. 当每个元素都添加到表单中时,将其添加到 aArrayList<AbstractFormElement>中,这将用于支持 a 的另一个 Adapter ListView。该适配器将根据它是什么类型的对象来调度自定义视图布局的膨胀以及ViewHolder的创建——这将要求每个不同的对象AbstractFormElement都有自己的“视图类型”,根据适配器. 请参阅BaseAdapter#getItemViewType(int)和相关getViewTypeCount()的 。

    值得注意的是,只有当一个不能转换为另一个时,它们才需要不同的视图类型……例如,如果你有两个“元素”,只需要在列表中显示一串文本,它们都可以共享一个“纯文本”视图类型。同样,仅显示一张照片或可以轻松地将一张照片转换为另一张的两个元素(例如,带有标题的图标与没有标题的照片缩略图)可以共享一个“图像加标题”视图类型。

考虑到上述情况,您实际上最终将不得不修改不同的文件以添加新类型(好吧,我想从技术上讲,您可以将它们全部作为内部类放在一个文件中,但是这样做确实没有好的论据) ,但是如果您正确地完成了您的接口 API,并遵循良好的 OO 实践,并实施了良好的单元测试,您将大大减少查找错误所需的工作量——因为大多数事情都涉及添加一个新的如果你做错了 type 实际上会导致编译器错误。除此之外,适当的单元测试套件将能够以编程方式添加所有可能的类型,并确保所有内容都正确显示,并且您应该有一个非常简化的过程以便于扩展:)

听起来工作量很大,一开始可能看起来乏味和冗长……但最终结果实际上更易于维护,尤其是当您的元素类型列表相当广泛时。

于 2011-06-14T02:15:37.890 回答