【问题标题】:Dynamic Form Generation using JSON Schema使用 JSON Schema 生成动态表单
【发布时间】:2013-10-12 16:32:11
【问题描述】:

我目前正在开发一个 android 应用程序,该应用程序根据 php 服务器以 json 格式提供的模式动态生成输入字段。我知道如何在 android 中动态创建字段。

我想得到一些关于 json 模式格式的建议,因为有很多输入类型,比如 EditText、Spinner、RadioGroup、RadioButton、CheckBox、DatePicker、TimePicker、Camera Image、User Signature 等。它们可能有默认值, Spinners 有多个值,DatePicker 和 TimePicker 有最大和最小限制,EditText 输入类型可能不同,比如数字、小数、文本、多行等,

关于 json 架构的一些建议会更有帮助,因为我对 json 的了解不多,而且在 android 中也应该很容易解析。

【问题讨论】:

    标签: php android json dynamic input


    【解决方案1】:

    这是一个有趣的项目。我建议您在模型类中遵循与 Android 完全相同的层次结构。每个模型类都将特定于其制作的视图。例如,EditTextModel 将包含 inputType 之类的字段,而 TextViewModel 可能仅包含 text 等。现在您只需要 google gson library 和一些用于 gson 的自定义适配器代码。

    详情: json可能是这样的。

    {
    "views": [
        {
            "class": "com.vj.TextViewModel",
            "properties": {
                "text": "hello world",
                "textColor": "#000000"
            }
        },
        {
            "class": "com.vj.EditTextModel",
            "properties": {
                "inputType": "number",
                "textSize": 20
            }
        }
    ]
    }
    

    使用 TextViewModel 类:

    public class TextViewModel implements Viewable{
        String text;
        String textColor;
    
        @Override
        public View getView(Context context){
            // generate and return view
            return view;
        }
    }
    

    和 EditTextModel 类:

    public class EditTextModel implements Viewable{
        String inputType;
        int textSize;
    
        @Override
        public View getView(Context context){
            // generate and return view
            return view;
        }
    }
    

    在哪里

    public interface Viewable{
        public View getView(Context context);
    }
    

    就通用 json 序列化/反序列化和适配器代码而言,请仔细观察并检查此代码,因为它与我上面生成的类似模型完全符合您的要求。 https://stackoverflow.com/a/8683689/1112882

    在您的 json 被解析并且您的 ArrayList 或可查看集合已准备好之后,只需迭代并调用 getView(context)。干杯... :)

    【讨论】:

    • 是的,我发现答案很有帮助,但我有疑问。如何读取各个字段的值?我的想法是使用 getValue() 方法创建一个类似于 Viewable 的接口,并在同一接口中实现所有可查看的类和 reset() 方法以重置表单字段。我说的对吗?
    • 您将使用 gson 库。 Gson 负责动态读取和写入值。
    • 您不需要读取值。在您的 getView 方法中,您将读取类变量并应用于 View 并返回它。但是,如果你想要一个通用接口来从 Model 类中读取值(虽然我不知道为什么它是必要的),那么你需要使用反射。
    • 真的我不认为 gson 可以从模型中读取值,因为在 EditText 的情况下它是 getText()。对于 spinner,它是 getSelectedItem(),对于 CheckBox,它是 isChecked(),对于 RadioGroup、Signature 和 CameraImage,它是不同的。
    • gson can read value from model 什么???? Gson 将读取 json 字符串并创建模型类的对象,并通过读取 json 为变量赋值。你用过gson吗???停止假设,至少尝试编写一个简单的场景。
    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多