在开发过程中,会经常遇到这样的需求:上面有很多的输入控件,等所有的输入都合法后,按钮才能自动变成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 检查输入的更多相关文章

  1. android键盘输入读取

    android键盘输入读取  监控android键盘输入方式有两种,一种在java层实现,重写onKeyDown和onKeyUp方法.另一种是在jni层实现,监控/dev/input/event0键盘 ...

  2. Android系统--输入系统(五)输入系统框架

    Android系统--输入系统(五)输入系统框架 1. Android设备使用场景: 假设一个Android平板,APP功能.系统功能(开机关机.调节音量).外接设备功能(键盘.触摸屏.USB外接键盘 ...

  3. Android系统--输入系统(六)模拟输入驱动程序

    Android系统--输入系统(六)模拟输入驱动程序 1. 回顾输入子系统 简单字符设备驱动:应用程序通过调用驱动所实现的函数使能硬件. 输入子系统:由于有多个应用程序使用输入子系统,故肯定使用的是早 ...

  4. Android系统--输入系统(七)Reader_Dispatcher线程启动分析

    Android系统--输入系统(七)Reader_Dispatcher线程启动分析 1. Reader/Dispatcher的引入 对于输入系统来说,将会创建两个线程: Reader线程(读取事件) ...

  5. Android系统--输入系统(八)Reader线程_使用EventHub读取事件

    Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...

  6. Android系统--输入系统(九)Reader线程_核心类及配置文件

    Android系统--输入系统(九)Reader线程_核心类及配置文件 1. Reader线程核心类--EventHub 1.1 Reader线程核心结构体 实例化对象:mEventHub--表示多个 ...

  7. Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析

    Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析 0. 前言 个人认为该知识点阅读Android源代码会不仅容易走进死胡同,并且效果并不好,前脚看完后脚忘记,故进行总结, ...

  8. Android系统--输入系统(十一)Reader线程_简单处理

    Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...

  9. Android系统--输入系统(十二)Dispatch线程_总体框架

    Android系统--输入系统(十二)Dispatch线程_总体框架 1. Dispatch线程框架 我们知道Dispatch线程是分发之意,那么便可以引入两个问题:1. 发什么;2. 发给谁.这两个 ...

随机推荐

  1. Report Server multiple value 多值选择

    一.项目需求 今天在做项目的时候,有一个需求,具体如下:在Report Server中存在一个报表,报表中有一个参数doctor_name,该参数允许多值,默认全部.但是由于前端页面医生选择时多选没有 ...

  2. SPOJ QTREE4 - Query on a tree IV 树分治

    题意: 给出一棵边带权的树,初始树上所有节点都是白色. 有两种操作: C x,改变节点x的颜色,即白变黑,黑变白 A,询问树中最远的两个白色节点的距离,这两个白色节点可以重合(此时距离为0). 分析: ...

  3. HDU 5528 Count a * b 欧拉函数

    题意: 定义函数\(f(n)\)为\(i \cdot j \not\equiv 0 \; (mod \; n)\)的数对\((i,j)\)的个数\((0 \leq i,j \leq n)\) \(g( ...

  4. Selenium WebDriver-操作下拉框内容

    操作下拉框中的内容 #encoding=utf-8 import unittest import time import chardet from selenium import webdriver ...

  5. day01_07.逻辑与字符串运算符

    &&(并且)====>发现&符号总是打错,记忆口令:&7(暗器),在数字7上面,在python中是and ||(或者)====>在python中是or . ...

  6. python--eclipse第一步总结

    1.SyntaxError: Non-UTF-8 code starting with '\xc4' in file C:\Users\yangqiong\workspace\create.报错 解决 ...

  7. jade和ejs两者的特点

    jade特点 1超强的可读性 2灵活易用的缩进 3块扩展 4代码默认进过编码处理,以增强安全性 5编译及运行时的上下文错误报告 6命令行编译支持 7html5模式(使用 !!!5文档类型) 8可选的内 ...

  8. 《机器学习实战》笔记——regression

    本章介绍了不同场景下使用的线性回归方法 一般情况:简单的线性回归 欠拟合:局部加权线性回归 特征数大于样本数:岭回归 或 lasso法 最后引出交叉验证,用来定量地找到最佳参数值 # _*_ codi ...

  9. 爬虫Scrapy框架-Crawlspider链接提取器与规则解析器

    Crawlspider 一:Crawlspider简介 CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能.其中最显著 ...

  10. mq类----2

    手动应答方式 使用get my_consumer.php 消费者  生产者和上一篇 一样 <?php /** * Created by PhpStorm. * User: brady * Dat ...