Android 检查输入
在开发过程中,会经常遇到这样的需求:上面有很多的输入控件,等所有的输入都合法后,按钮才能自动变成enabled的状态,才能继续下一步的操作。
下面是一种用观察者模式实现的一种解决方案。
button代码:
public class KWButton extends Button implements Observer {
private LinkedHashSet<Verifiable> mVerifiers = new LinkedHashSet<Verifiable>();
public KWButton(Context context) {
super(context);
initView();
}
public KWButton(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public KWButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
private void initView() {
// 初始化view
}
/**
* 添加观察者
*
* @param verifier
*/
public void observer(Verifiable verifier) {
if (this.isEnabled()) {
this.setEnabled(false);
}
// 校验:如果当前verifier属于view 但是 不可显示则不做监听
if ((verifier instanceof View)
&& ((View) verifier).getVisibility() != View.VISIBLE) {
update(null, null);
return;
}
if (verifier != null && !mVerifiers.contains(verifier)) {
mVerifiers.add(verifier);
//精华所在
verifier.addObserver(this);
}
update(null, null);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
}
/**
* 解除观察
*
* @param verifier
*/
public void removeObserver(Verifiable verifier) {
if (verifier != null) {
mVerifiers.remove(verifier);
this.update(null, null);
}
}
/**
* 清空观察者
*/
public void clearObserver() {
if (!ListUtil.isEmpty(mVerifiers)) {
mVerifiers.clear();
mAutoPerformClick = false;
this.update(null, null);
}
}
@Override
public void update(Observable observable, Object data) {
if (mAutoPerformClick) {
if (!ListUtil.isEmpty(mVerifiers)) {
if (isVerify()) {
this.postDelayed(new Runnable() {
@Override
public void run() {
performClick();
}
}, PERFORM_DELAY_TIME);
}
}
} else {
for (Verifiable verifier : mVerifiers) {
if (verifier.isBlank()) {
KWButton.this.setEnabled(false);
return;
}
}
KWButton.this.setEnabled(true);
}
}
/**
* 是否已通过验证
*
* @return
*/
private boolean isVerify() {
for (Verifiable verifier : mVerifiers) {
if (!verifier.verify()) {
return false;
}
}
return true;
}
}
校验接口:
/**
* 校验接口
*
*/
public interface Verifiable {
/**
* 校验
*
* @return
*/
boolean verify();
boolean isBlank();
void addObserver(Observer obj);
}
输入控件:
/**
* 输入控件
*/
public class NeedCheckInput extends EditText implements Verifiable { private Context mContext;
/**
* 校验
*/
private Observer mVerifyObserver = null; public NeedCheckInput(Context context) {
super(context);
mContext = context;
init();
} public NeedCheckInput(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
init();
} @SuppressLint("InflateParams")
private void init() {
// 初始化view 代码
}
/*
// 通知观察者,控件状态已经改变,update一次,就检查一次
if (mVerifyObserver != null) {
mVerifyObserver.update(null, null);
}
*/ @Override
public boolean verify() {
//添加校验规则 true:校验通过 false:校验不通过
return !TextUtils.isEmpty(this.getText().toString());
} @Override
public boolean isBlank() {
return ....;
} @Override
public void addObserver(Observer obj) {
mVerifyObserver = obj;
} }
示例代码:
KWButton button = new KWButton(context);
NeedCheckInput input1 = new NeedCheckInput(context);
NeedCheckInput input2 = new NeedCheckInput(context); button.addObserver(input1);
button.addObserver(input2);
这样就可以做到检查输入了。
Android 检查输入的更多相关文章
- android键盘输入读取
android键盘输入读取 监控android键盘输入方式有两种,一种在java层实现,重写onKeyDown和onKeyUp方法.另一种是在jni层实现,监控/dev/input/event0键盘 ...
- Android系统--输入系统(五)输入系统框架
Android系统--输入系统(五)输入系统框架 1. Android设备使用场景: 假设一个Android平板,APP功能.系统功能(开机关机.调节音量).外接设备功能(键盘.触摸屏.USB外接键盘 ...
- Android系统--输入系统(六)模拟输入驱动程序
Android系统--输入系统(六)模拟输入驱动程序 1. 回顾输入子系统 简单字符设备驱动:应用程序通过调用驱动所实现的函数使能硬件. 输入子系统:由于有多个应用程序使用输入子系统,故肯定使用的是早 ...
- Android系统--输入系统(七)Reader_Dispatcher线程启动分析
Android系统--输入系统(七)Reader_Dispatcher线程启动分析 1. Reader/Dispatcher的引入 对于输入系统来说,将会创建两个线程: Reader线程(读取事件) ...
- Android系统--输入系统(八)Reader线程_使用EventHub读取事件
Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...
- Android系统--输入系统(九)Reader线程_核心类及配置文件
Android系统--输入系统(九)Reader线程_核心类及配置文件 1. Reader线程核心类--EventHub 1.1 Reader线程核心结构体 实例化对象:mEventHub--表示多个 ...
- Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析
Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析 0. 前言 个人认为该知识点阅读Android源代码会不仅容易走进死胡同,并且效果并不好,前脚看完后脚忘记,故进行总结, ...
- Android系统--输入系统(十一)Reader线程_简单处理
Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...
- Android系统--输入系统(十二)Dispatch线程_总体框架
Android系统--输入系统(十二)Dispatch线程_总体框架 1. Dispatch线程框架 我们知道Dispatch线程是分发之意,那么便可以引入两个问题:1. 发什么;2. 发给谁.这两个 ...
随机推荐
- PAT Basic 1082
1082 射击比赛 本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟.我们假设靶心在原 ...
- emacs写cnblog博客
emacs的版本 org-mode版本 参考链接: 用Emacs管理博客园博客 用emacs org-mode写cnblogs博客 用emacs org-mode写博客 & 发布到博客 ...
- C++异常安全的赋值运算符重载 【微软面试100题 第五十五题】
题目要求: 类CMyString的声明如下: class CMyString { public: CMyString(char *pData=NULL); CMyString(const CMyStr ...
- rocketmq源码分析4-事务消息实现原理
为什么消息要具备事务能力 参见还是比较清晰的.简单的说 就是在你业务逻辑过程中,需要发送一条消息给订阅消息的人,但是期望是 此逻辑过程完全成功完成之后才能使订阅者收到消息.业务逻辑过程 假设是这样的: ...
- python基础补漏-07-正则表达式
字符: . 匹配除了换行符以外的任意字符 \w 匹配字母或者数字或下划线或汉字(除了特殊字符外都能匹配) \s 匹配任意空白符 \d 匹配数字 \b 匹配单词的开始或者结束 ^ 匹配字符串 ...
- 使用PYTHON创建XML文档_python
当用GOOGLE查的时候,内容几乎都是一样的.但是你想要的东西,一个也没有.例如,我就找不到中国人写的如何使用PYTHON来创建一个XML文件.当然,直接用文件写的方式也能够达到同样的效果,但是毕竟容 ...
- 2015长春网络赛1001 求连通快数量的问题dfs
Ponds Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Sub ...
- 2016湖南省赛----G - Parenthesis (括号匹配)
2016湖南省赛----G - Parenthesis (括号匹配) Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of lengt ...
- CS231n笔记 Lecture 3 Loss Functions and Optimization
这一讲总体上就是引入Loss Function的概念,以及让大家对优化有一个初步的认识,和其他课程里面说的内容大同小异. Loss function Multiclass svm loss multi ...
- HDU——1003Max Sum(子序列最大和)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...