在生产型Android客户端软件(企业级应用)开发中,界面可能存在多个输入(EditText)和多个操作(MotionEvent和KeyEvent),且操作依赖于输入的状态。如下图所示的场景:
设定图中
输入框有三种状态:
操作需要当其依赖的输入数据校验成功,才能执行。
如果在Activity中去判断输入框状态,那么实际需要调用(3个输入框)*(3种状态)*(3个按钮) = 27个 if 判断,对于状态的维护将使得整个程序可维护性极差,并随着输入和操作的增加,维护的状态呈指数增长。
通过对这种场景的抽象,实现了Android控件状态依赖框架,其使用方法如下:
使用方法:
1、布局文件引用WatchEditText和WatchButton
<com.android.yhthu.viewdependency.view.WatchEditText android:id="@+id/edit_query_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:tag="editQuery1" android:imeOptions="actionNext" android:hint="商品编码" android:inputType="number"/> <com.android.yhthu.viewdependency.view.WatchButton android:id="@+id/search_button_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:tag="buttonSearch1" android:text="确认" />
由于Library Module中的控件id不是常量(可参考ButterKnife对Library Module的支持采用R2的原因),这里采用了tag的方式。
2、在Activity中通过注解申明依赖
@ViewName("商品编码") private WatchEditText editQuery1; @ViewName("储位") private WatchEditText editQuery2; @ViewName("数量") private WatchEditText editQuery3; @ViewDependency(name = @ViewName("确认"), dependency = {"editQuery1", "editQuery2"}) private WatchButton buttonSearch1; @ViewDependency(name = @ViewName("跳过")/*不依赖输入*/) private WatchButton buttonSearch2; @ViewDependency(name = @ViewName("登记缺货"), dependency = {"editQuery2", "editQuery3"}) private WatchButton buttonSearch3;
ViewName定义控件名称,ViewDependency中dependency指定其依赖的控件tag。
3、直接执行onClick和onEditorAction(修改状态)
@Override public void onClick(View v) { if (v == buttonSearch1) { Toast.makeText(this, "调接口", Toast.LENGTH_SHORT).show(); } else if (v == buttonSearch2) { Toast.makeText(this, "跳下一页", Toast.LENGTH_SHORT).show(); } else if (v == buttonSearch3) { Toast.makeText(this, "登记缺货", Toast.LENGTH_SHORT).show(); } }
可以看出,这里并没有通过if判断各个输入控件的状态。
@Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_NEXT && v == editQuery1 && (query1Str = editQuery1.getText().toString()).isEmpty()) { if (query1Str.equals("12345")) { editQuery1.complete(); return true; } } // 省略代码 return false; }
onEditorAction模拟调用软件的Enter进行校验,这里需要注意通过editQuery1.complete()修改该EidtText的状态。
实现原理
整个框架分为三个package:annotation、state和view。
1、在annotation中定义ViewName和ViewDependency注解,分别用于WatchEditText和WatchButton。ViewName指定WatchEditText控件在业务中的名称,ViewDependency指定WatchButton依赖的WatchEditText控件;
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ViewDependency { ViewName name() default @ViewName; String[] dependency() default {}; }
2、在state中通过状态模式定义Enter、Verify、Complete,其基类为抽象类Operator,定义方法operator;
public abstract class Operator { // 操作对应的上下文 protected Context context; // 操作 public abstract boolean operator(String operatorName, String viewName); }
public class Enter extends Operator { private static Enter enter; private Enter(Context context) { this.context = context; } public static Enter getInstance(Context context) { if (enter == null) { enter = new Enter(context); } return enter; } @Override public boolean operator(String operatorName, String viewName) { Toast.makeText(context, String.format("[%s]为空,不允许执行[%s]", viewName, operatorName), Toast.LENGTH_SHORT).show(); return false; } }
3、WatchEditText和WatchButton定义控件的依赖关系。WatchEditText实现ViewState接口,其包含三种状态的转换方法。
public interface ViewState { void enter(); void verify(); void complete(); }
以上,博客园对markdown支持的不太好,无法添加注释(/* */),如需查看源码,请移步Github地址:https://github.com/yhthu/AndroidViewDependency.git
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Android控件ToggleButton多状态按钮使用详解,包括了Android控件ToggleButton多状态按钮使用详解的使用技巧和注意事项,需要的朋友参考一下 什么是ToggleButton? ToggleButton一般有两种状态:选中和未选中 并且需要为不同状态设置不同的文本 ToggleButton属性 android:checked=”true”——当前按钮状态,选
本文向大家介绍Android中Spinner(下拉框)控件的使用详解,包括了Android中Spinner(下拉框)控件的使用详解的使用技巧和注意事项,需要的朋友参考一下 android给我们提供了一个spinner控件,这个控件主要就是一个列表,那么我们就来说说这个控件吧,这个控件在以前的也看见过,但今天还是从新介绍一遍吧。 Spinner位于 android.widget包下,每次只显示用户选
本文向大家介绍详解HTTP状态码,包括了详解HTTP状态码的使用技巧和注意事项,需要的朋友参考一下 以上所述是小编给大家介绍的HTTP状态码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!
本文向大家介绍AngularJS $injector 依赖注入详解,包括了AngularJS $injector 依赖注入详解的使用技巧和注意事项,需要的朋友参考一下 推断式注入 这种注入方式,需要在保证参数名称与服务名称相同。如果代码要经过压缩等操作,就会导致注入失败。 标记式注入 这种注入方式,需要设置一个依赖数组,数组内是依赖的服务名字,在函数参数中,可以随意设置参数名称,但是必须保证顺序的
本文向大家介绍Android 监听网络状态方法详解,包括了Android 监听网络状态方法详解的使用技巧和注意事项,需要的朋友参考一下 Android 监听网络状态方法详解 一.加入网络权限 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限。 二.判断手机网络的几个方案 1)判断是否有网络连接 2)判断WIFI网络是否可用 4)获取当前网络连接的类型信息 在开发and
本文向大家介绍android之SeekBar控件用法详解,包括了android之SeekBar控件用法详解的使用技巧和注意事项,需要的朋友参考一下 MainActivity.java activity_main.xml 以上就是小编为大家带来的android之SeekBar控件用法详解的全部内容了,希望对大家有所帮助,多多支持呐喊教程~