Z在生产型Android客户端软件(企业级应用)开发中,界面可能存在多个输入(<code>EditText</code>)和多个操作(<code>MotionEvent</code>和<code>KeyEvent</code>),且操作依赖于输入的状态。如下图所示的场景:
设定图中
确认操作依赖于商品编码和储位的状态
跳过操作不依赖于输入状态
登记差异操作依赖于储位和数量的状态
输入框有三种状态:
待输入;
待校验;
校验成功。
操作需要当其依赖的输入数据校验成功,才能执行。
如果在Activity中去判断输入框状态,那么实际需要调用(3个输入框)<code>*</code>(3种状态)<code>*</code>(3个按钮) = 27个 if 判断,对于状态的维护将使得整个程序可维护性极差,并随着输入和操作的增加,维护的状态呈指数增长。
通过对这种场景的抽象,实现了Android控件状态依赖框架,其使用方法如下:
使用方法:
布局文件引用<code>WatchEditText</code>和<code>WatchButton</code>
由于<code>Library Module</code>中的控件<code>id</code>不是常量(可参考<code>ButterKnife</code>对<code>Library Module</code>的支持采用<code>R2</code>的原因),这里采用了<code>tag</code>的方式。
在<code>Activity中</code>通过注解申明依赖
<code>ViewName</code>定义控件名称,<code>ViewDependency</code>中<code>dependency</code>指定其依赖的控件<code>tag</code>。
直接执行<code>onClick</code>和<code>onEditorAction</code>(修改状态)
可以看出,这里并没有通过<code>if</code>判断各个输入控件的状态。
<code>onEditorAction</code>模拟调用软件的<code>Enter</code>进行校验,这里需要注意通过<code>editQuery1.complete()</code>修改该<code>EidtText</code>的状态。
整个框架分为三个package:<code>annotation</code>、<code>state</code>和<code>view</code>。
在<code>annotation</code>中定义<code>ViewName</code>和<code>ViewDependency</code>注解,分别用于<code>WatchEditText</code>和<code>WatchButton</code>。<code>ViewName</code>指定<code>WatchEditText</code>控件在业务中的名称,<code>ViewDependency</code>指定<code>WatchButton</code>依赖的<code>WatchEditText</code>控件;
在<code>state</code>中通过状态模式定义<code>Enter</code>、<code>Verify</code>、<code>Complete</code>,其基类为抽象类<code>Operator</code>,定义方法<code>operator</code>;
<code>WatchEditText</code>和<code>WatchButton</code>定义控件的依赖关系。<code>WatchEditText</code>实现<code>ViewState</code>接口,其包含三种状态的转换方法。
本文转自xsster51CTO博客,原文链接: http://blog.51cto.com/12945177/1929759,如需转载请自行联系原作者
本文转自xsster51CTO博客,原文链接: 本文转自xsster51CTO博客,原文链接: ,如需转载请自行联系原作者
,如需转载请自行联系原作者