我有一个带有多个旋转器和子旋转器的 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
并为所有内容创建一个项目(用于翻译),并构建一个可以为 定义属性的类isMandatory
或 hasSubcategories
或者可能是 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/