java - 如何在 Java 中使用必填字段构建可重用的动态输入逻辑

标签 java android xml design-patterns

我有一个带有多个旋转器和子旋转器的 fragment ,其背后有一定的“逻辑”。如果我在第一个微调器中进行选择,则可能是:

1.) 这已经是一个答案,没有更多选项可用

2.) 出现第二个微调器,您可以根据您在第一个微调器中的选择,在第二个微调器中选择一个项目

3.) 更有可能的是,第二个微调器中的所选项目会让 EditText 出现,您可以在其中输入内容

这可能是一个“逻辑”示例。

Spinner 1 | Spinner 2 | EditText
----------------------------------
Item 1    | -         | -            (No more input necessary, everything done)
Item 2    | Item 1    | -            (A second spinner appears...)
Item 2    | Item 2    | (Activated)  (An EditText appears after selection in Spinner2)

我希望它能以某种方式变得清晰......所以我的项目和子项目被保存为strings.xml中的几个string-array

喜欢:

    <string-array name="cat1">
            <item>Item1</item>
            <item>Item2</item>
   </string-array>

   <string-array name="sub_cat1">
            <item>Item1</item>
            <item>Item2</item>
    </string-array>

    ...

我需要将它们存储在 strings.xml 中,因为我想让我的应用程序以不同的语言提供。实际上我正在做这样的事情:

在我的第一个微调器的 OnItemSelectedListener 中,我检查选择了哪个位置,然后我有一个开关/案例来实现逻辑。在第二个微调器的 OnItemSelectedListener 中,我必须执行相同的操作并使用逻辑实现 switch/case(例如,如果应该出现 EditText 或一切正常并且用户可以继续)...

所以一切或多或少都是硬编码的。我真的不喜欢这个,因为它并不是真正可维护的..如果我更改 string-array 中的顺序,我必须更正每个开关/大小写...或者如果我添加或删除某些内容某物。但实际上我不知道改进这个设计的最佳方法是什么。

我只能删除 xml 中的所有 string-arrays 并为所有内容创建一个项目(用于翻译),并构建一个可以为 定义属性的类isMandatoryhasSubcategories 或者可能是 hasChild

是否有任何模式或想法如何创建我的需求的可维护和动态实现?先感谢您!

最佳答案

作为一名 Android 开发人员,我多年来一直遇到这样的情况:开发人员倾向于使用 Android 类和 Android 工具来实现所有内容,尽管使用 POJO 可以轻松解决这些问题。

您应该记住,Android 只是一个让您与用户交互的框架,它不会假装做任何其他事情,我们作为开发人员应该在这种情况下使用它。

无论如何,为了解决你的问题,我会非常自信地创建一个 Composite “Items”的数据结构,以及使用 Visitor 遍历它们的方法.

顺便说一句:不要只称它们为项目,它们只是为了解决您正在解决的特定问题。您应该使用(UI)逻辑上下文来命名它们。由于您没有提及任何内容,为了下面的示例,我将它们称为 Item。

interface Item {
    void accept(ItemVisitor itemVisitor);
}

abstract class ItemWithName implements Item {
    private final String name;

    /*CTOR*/

    public String getName() {
        return name;
    }
}

class SpinnerLeafItem extends ItemWithName {
    /*CTOR*/

    public void accept(ItemVisitor itemVisitor) {
       itemVisitor.visit(this);
    }
}

class CompositeSpinnerItem extends ItemWithName {
    private final String name;
    private final List<Item> innerItems;

    /*CTOR*/

    public void accept(ItemVisitor itemVisitor) {
       itemVisitor.visit(this);
    }

    /* Getter for inner items */
}

class EditTextItem extends ItemWithName {
    /*CTOR*/

    public void accept(ItemVisitor itemVisitor) {
       itemVisitor.visit(this);
    }
}

是的,我知道 EditTextItem 和 SpinnerLeafItem 实际上持有相同的参数。但同时拥有它们可以提供可扩展的代码和运行时的类型识别。如果您不这样做,您将必须拥有一个属性来告诉您该项目是编辑文本项目还是违反 SRP 的旋转叶项目。 .

现在您可以拥有一个存储库接口(interface),它不会将您限制在 string.xml 实现上,并且会为您提供可扩展的代码,让您可以从任何地方加载项目。

interface SpinnerItemsRepository {
    List<Item> getAllItems();
}

祝你好运。

关于java - 如何在 Java 中使用必填字段构建可重用的动态输入逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34244312/

相关文章:

xml - 两个相邻的tileContainer

安卓 : preferencescreen right to left

java - 操作栏在 Lollipop 之前的设备中透明

java - 为基于套接字的 Android 应用程序创建非卡住 UI 的理想方式

android - 结合 JavaCV 和 openCV

android - 翻页器控件 - 就像 android 主屏幕

java - 如何将 'where' mySQL 查询转换为方法语法?

java - 使用 notifyAll() 的多线程

java.lang.ClassCastException : org. apache.struts.validator.DynaValidatorForm 无法转换

java - 检查一个数字是否在斐波那契数列中?