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. 发给谁.这两个 ...
随机推荐
- 安装repo
$ sudo apt-get install curl -y$ curl "http://android.git.linaro.org/gitweb?p=tools/repo.git;a=b ...
- UOJ 152 汉诺塔 分治
题目链接 题意: 有三根编号为\((1, \, 2, \, 3)\)的柱子,然后第一根柱子上有编号为\(1 \sim n(n \leq 10000)\)的盘子,从上到下第\(i\)个盘子的编号是\(A ...
- POJ - 1321 深度优先搜索入门
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> us ...
- Java-一个数组中的元素复制到另一个数组
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length).其中五个参数分别表示为: ...
- 大数据学习——spark笔记
变量的定义 val a: Int = 1 var b = 2 方法和函数 区别:函数可以作为参数传递给方法 方法: def test(arg: Int): Int=>Int ={ 方法体 } v ...
- 使mysql的表内容可以输入中文内容
修改数据库的字符集mysql>use mydb mysql>alter database mydb character set utf8;
- TensorFlow batch normalize的使用
TensorFlow batch normalize的使用 batch normalize 经常与CNN搭配使用,据一些研究表面,在RNN层数不是很深的时候使用batch normalize是会用损害 ...
- 为什么在header 和 session 之前不能有输出
1.在header输出之前有输出内容的话,就会造成对header的错误理解(尽管现在已经能容错了),例如不是满足“keyword: value\n”的格式还好,直接错误了,但是满足“keyword: ...
- ABP介绍
ABP是ASP.NET Boilerplate Project (ASP.NET样板项目)的简称. ABP 适用的场景:中小规模 WEB 应用开发,可直接使用 ABP 框架. 较大型项目可以在 ABP ...
- 【Istio】error initializing configuration '/etc/istio/proxy/envoy-rev0.json': malformed IP address: istio-statsd-prom-bridge
今天遇到一个问题,istio的组件一直在重启,查看log大概是这个样子 --03T07::.935580Z info Epoch starting --03T07::.936317Z info Env ...