Skip to content

专门用于复杂的信息编辑页面的组件,能够快速开发编辑页面,自动导入、导出参数

Notifications You must be signed in to change notification settings

WayJ/InputBinder

Repository files navigation

InputBinder

一个能够快速开发form表单页面的工具,自带了基础样式,快速搭建复杂且数目较多的form表单页面。

在实例类的Field上添加@Input注解,即将该项输入项纳入控制。该库会处理后续的存取数据、设置操作等各种功能。

  • 配置输入控件的类型、请求参数名、视图操作类型(button、checkbox)
  • 配置方式:注解 @input
  • 设置输入项的数据:
    • 将实体类的实例的数据设置到输入项上,并进行绑定操作,绑定后,输入项上的用户输入会自定赋值到绑定的对象
    • 将Map<String,String>的数据设置到输入项上
  • 获得用户输入的数据,将用户编辑好的输入控件上的值取出,
    • 返回一个Map<String,String>:key为请求参数名,value为具体的参数值
    • 返回一个实体类的实例
  • 有基本输入控件类型支持:文本输入、时间选择、打勾选中、多选一、多选多等基本类型
  • 有自带基础样式支持,且可扩展:inputbinder-style。样式与核心代码分离,可修改扩展
  • 支持自定义的输入控件:例如身份证输入、图片选择、音频录入等

Import

  Download

    api 'com.wayj.inputbinder:inputbinder:+'
    api 'com.wayj.inputbinder:inputbinder-style:+'
    
    //私有maven    
    api 'com.tianque.android:inputbinder:+'
    api 'com.tianque.android:inputbinder-style:+'
  • inputbinder:核心代码
  • inputbinder-style:样式代码,可随意修改

支持的form表单的input类型

  • 文本输入框
  • 按钮
  • 日期选择
  • 勾选框
  • 单选框
  • 多选框
  • 支持自行扩展

使用

仅说明实体类注解的配置方式,xml配置可见example。

注解

将实体类的变量与输入表单上的控件关联起来,用@Input 注解标记上,对应的Layout文件

class Student {
	/////基本
    @Input
    var name: String? = null
    @Input 
    var address: String? = null
    @Input
    var isBoy: Boolean = false
    ////////// 时间
    @Input(type = InputItemType.Date)
    private var birthday: String? = null
    ////////// 
    @Input(type = InputItemType.Optional, parm = "{'optionalKeys':['0.6','0.8','1.0']}", requestKey = "vision")
    var vision: String? = null//视力
    @Input(type = InputItemType.Optional, parm = "{'optionalKeys':['0.6','0.8','1.0'],'optionalValues':['6','8','10']}", requestKey = "student.vision2")
    var vision2: String? = null//视力
    @Input(type = InputItemType.MultiOptional, parm = "{'optionalKeys':['语文','数学','英语']}")
    var multi: String? = null
    ////////checkbox
    /**
     * 通过checkbox控件的值来控制某些控件显示不显示 dependent 是正依赖,即该控件和关联控件的显示是一致的,要么都显示,要么都不显示,dependent_inversion则是翻回来只显示一个
     * 这里仅对view进行控制,没有对最后的数据进行处理
     */
    @Input(parm = "{'dependent':'roomNumber','dependent_inversion':'address'}")
    var hasRoom: Boolean = false
    @Input
    var roomNumber: String? = null
    @Input
    var address: String? = null
    ////////自定义
    @Input(type = InputItemType.Extend, requestKey="teacher.id",parm = "{'dicName':'教师名字'}")
    var teacher:Teacher? = null

}
  • type = InputItemType.XXX:表示这个输入控件的类型,可不设置,如果不设置,默认等于该变量的类型(String,Date,Boolean)
    • InputItemType.Extend:自定义扩展类型,如果标记这个类型,将会讲一些处理过程交由ItemTypeConvert来做,需要开发者自己继承ItemTypeConvert类来实现功能
  • requestKey:发送请求时的输入项请求参数名,默认与变量名相同,可配置
  • viewName:关联View的依据,默认与变量名相同,可配置
  • required: 是否必填,可通过validateRequestParams 方法来验证必填项是否全部填写
  • parm:不同输入项类型有不同的参数配置,必须是JSON类型字符串
    • Optional:单选项(多选一)
      • optionalKeys:选项显示的文字
      • optionalValues:发送请求时的value,如果不设置的话默认等同于optionalKeys
    • CheckBox:勾选框
      • dependent:正依赖,即如果打勾则显示、否则就隐藏
      • dependent_inversion:反向依赖,即如果打勾则不显示,不打勾就隐藏
    • 自定义
      • item初始化时,可通过ViewAttribute.parm 获得配置的参数
      • item初始化后,可通过getConfig(String)来获得配置

InputBinder使用

具体例子见这里

mInputBinder = InputBinder.Build(this)
      .readProfile(getFormVO().getClass())
      .create();
mInputBinder.addInputItem(buttonInputItem)
           .start();
//绑定VO,即导入数据 + 数据单项绑定
mInputBinder.bind(getFormVO());

导入数据(查看详情、修改等时候用到)

//模拟数据
var student = Student()
student.address="sadas"
student.teacher = Teacher(2,"zhang san")
//导入而不绑定
inputBinder.putIn(student)

导出数据

inputBinder.getRequestMap();
inputBinder.putOutToObject(new Student());

刷新视图

inputBinder.updateView()

设置不可编辑不可点击

inputBinder.getEngine().setAllViewEnable(false)

自定义类型示例:类型转换器 将对应的复杂类型的输入项的数据转换成对应的InputItem

class TeacherItemConvert : OptionalInputItemConvert<Teacher>() {
    override fun initOptionalData(optionalInputItem: OptionalInputItem?): OptionalInputItem.OptionalData<Teacher> {
        val data = OptionalInputItem.OptionalData<Teacher>();
        data.add("张老师",Teacher(1,"张三"))
        data.add("李老师", Teacher(2,"李四"))
        data.add("王五",Teacher(3,"王五"))
        return data
    }
}

找到某个InputItem进行操作

InputBinder.findInputByViewId(int viewId)
InputBinder.findInputByViewName(String viewName)

POJO配置读取说明

会读取标记了@input的成员变量,且会读取父类的配置

可以读取成员变量的类型中配置的@Input,要使用InputItemType.Recursion(递归读取)

public class Boy extends People{
    @Input
    public String name;
	@Input(type=InputItemType.Recursion)
	public Father father;
}

public class Father extends People{
    @Input
    public String name;
    @Input
    public String remark;
}

public class People{
    @Input
    public String birthday;
    @Input(type = InputItemType.Optional)
    public String sexType;
}

上面的代码通过 inputBinder.readProfile(new Boy())

得到以下输入项配置,即 7个输入项配置-

Profile Name 名字,默认的viewId 输入项类型
name TextInputItem
birthday TextInputItem
sexType OptionalInputItem
father.name TextInputItem
father.remark TextInputItem
father.birthday TextInputItem
father.sexType OptionalInputItem

然后会查询Layout文件中View,如果没有找到对应的输入项视图,会直接删去该 Profile。

数据绑定说明

在执行绑定代码后,默认会进行单项数据绑定

Boy boy=new Boy();

inputBinder.readProfile(Boy.class);
inputBinder.start();
inputBinder.bind(boy);

//如果用户在 boy的name输入项 填入了数据 ("李磊"),则 boy.name会自动修改
print(boy.getName());   // ->  李磊

//也可以这样,将全部的输入数据赋值到 object
Boy boyNew=new Boy();
inputBinder.putOut(boyNew);
print(boy.getName());  //  ->  李磊

TodoList

  • 完善数据校验功能

    • (已支持)校验支持逻辑运算-与,譬如 手机号码,不为空(必填)且手机号码格式正确

    • //kotlin
      verify= Input.Verify_NotNull and Input.Verify_Mobile
      //java 
      verify= Input.Verify_NotNull & Input.Verify_Mobile
      
    • 但是不支持逻辑运算-或,譬如 身份证件,或为15位老身份证或为18位老身份证

About

专门用于复杂的信息编辑页面的组件,能够快速开发编辑页面,自动导入、导出参数

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors