在生产型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
# 控件状态
# 依赖框架
# android实现圆环倒计时控件
# Android Studio给各种控件加边框的操作方法
# Android自定义view实现倒计时控件
# Android实现简单的下拉刷新控件
# Android日期选择控件使用详解
# Android自定义控件横向柱状统计图
# Android APT 实现控件注入框架SqInject的示例
# 输入框
# 多个
# 依赖于
# 跳过
# 采用了
# 三种
# 生产型
# 可以看出
# 所示
# 中去
# 如需
# 跳下
# 需要注意
# 图中
# 有三种
# 大家多多
# 如下图
# 为空
# 方法如下
# 客户端软件
相关文章:
Python多线程使用规范_线程安全解析【教程】
如何设计高效校园网站?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
如何选择高效稳定的ISP建站解决方案?
营销式网站制作方案,销售哪个网站招聘效果最好?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
广州美橙建站如何快速搭建多端合一网站?
javascript中对象的定义、使用以及对象和原型链操作小结
建站之星安装路径如何正确选择及配置?
,石家庄四十八中学官网?
如何在阿里云ECS服务器部署织梦CMS网站?
建站之星如何一键生成手机站?
如何在搬瓦工VPS快速搭建网站?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
简单实现Android文件上传
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何选择建站程序?包含哪些必备功能与类型?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何快速搭建安全的FTP站点?
如何高效完成独享虚拟主机建站?
郑州企业网站制作公司,郑州招聘网站有哪些?
香港服务器选型指南:免备案配置与高效建站方案解析
实现点击下箭头变上箭头来回切换的两种方法【推荐】
详解jQuery中基本的动画方法
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
网站制作公司排行榜,四大门户网站排名?
音乐网站服务器如何优化API响应速度?
如何基于云服务器快速搭建网站及云盘系统?
如何在IIS中新建站点并配置端口与物理路径?
如何挑选优质建站一级代理提升网站排名?
,购物网站怎么盈利呢?
如何在自有机房高效搭建专业网站?
Android自定义控件实现温度旋转按钮效果
建站之星后台管理:高效配置与模板优化提升用户体验
建站主机是否等同于虚拟主机?
如何在橙子建站中快速调整背景颜色?
如何在建站主机中优化服务器配置?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
如何做静态网页,sublimetext3.0制作静态网页?
图册素材网站设计制作软件,图册的导出方式有几种?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
金*站制作公司有哪些,金华教育集团官网?
如何获取开源自助建站系统免费下载链接?
婚礼视频制作网站,学习*后期制作的网站有哪些?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
建站主机选虚拟主机还是云服务器更好?
,网页ppt怎么弄成自己的ppt?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
如何在香港服务器上快速搭建免备案网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。