关于多个EditText的OnTextChange事件陷入死循环的处理

需求:ListView的Item上面有三个EditText控件,分别为 数量 ,单价,总价,要求输入数量跟单价时候 总价跟着计算变化,当输入总价时候 数量不变,改变单价。

实现:首先肯定想到的是对EditText进行监听,实现TextWatcher接口,在onTextChanged 方法中进行计算,由于三个EditText存在关联,肯定要监听3个,如果处理不好的话,改变一个值,其他的值也改变,这样会陷入一个死循环。虽然有removeTextChangedListener 这个方法,但是实在不敢恭维,容易出错。最好的办法当然是 当一个EditText获得焦点时候先清除所有的OnTextChanged监听 然后addTextChangedListener。这样就能保证始终只有一个EditText获得监听,而不会陷入死循环中。看了下源代码,google并没有提供清除所有监听的方法,只能自己实现一个了。

自定义EditText控件,调用clearTextChangedListeners() 这个方法即可清除所有实现TextWatcher的监听。

package com.Ieasy.Tool;

import java.util.ArrayList;

import android.content.Context;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.widget.EditText;

public class ExtendedEditText extends EditText {

  private ArrayList<TextWatcher> mListeners = null;

  public ExtendedEditText(Context ctx)
  {
      super(ctx);
  }

  public ExtendedEditText(Context ctx, AttributeSet attrs)
  {
      super(ctx, attrs);
  }

  public ExtendedEditText(Context ctx, AttributeSet attrs, int defStyle)
  {
      super(ctx, attrs, defStyle);
  }

  @Override
  public void addTextChangedListener(TextWatcher watcher)
  {
      if (mListeners == null)
      {
          mListeners = new ArrayList<TextWatcher>();
      }
      mListeners.add(watcher);

      super.addTextChangedListener(watcher);
  }

  @Override
  public void removeTextChangedListener(TextWatcher watcher)
  {
      if (mListeners != null)
      {
          int i = mListeners.indexOf(watcher);
          if (i >= 0)
          {
              mListeners.remove(i);
          }
      }

      super.removeTextChangedListener(watcher);
  }

  public void clearTextChangedListeners()
  {
      if(mListeners != null)
      {
          for(TextWatcher watcher : mListeners)
          {
              super.removeTextChangedListener(watcher);
          }

          mListeners.clear();
          mListeners = null;
      }
  }

}
时间: 2024-10-18 00:17:56

关于多个EditText的OnTextChange事件陷入死循环的处理的相关文章

从ScrollView嵌套EditText的滑动事件冲突分析触摸事件的分发机制以及TextView的简要实现和冲突的解决办法

本篇文章假设读者没有任何的触摸事件基础知识,所以我们会从最基本的触摸事件分发处说起. ScrollView为什么会出现嵌套EditText出现滑动事件冲突呢?相信你会有这种疑问,我们来看这么一种情况: 有一个固定高度的EditText,假设它只能显示3行文本,但是,我们在其中输入的文本多余三行时,那么这时就需要可以在EditText内部进行小幅滚动了.那么将这个EditText放入了ScrollView当中, 并且ScrollView内容过多以致ScrollView也可以滑动,这时候就会出现Ed

Windows批处理脚本陷入死循环问题

Windows批处理脚本陷入死循环问题 现象 bat脚本内容十分简单,就一条命令: start cmd 本意是执行bat脚本,就会弹出cmd窗口.看似很简单的一件事,但是出现了超出意料的事情. 双击刚编写的脚本后,windows就出现了死循环现象,cmd窗口一直不停的弹出,根本无法关闭,最后强制关机. 原因分析 出现死循环的原因在于bat脚本的命名上,bat脚本以cmd.bat命名.双击包含start cmd命令的脚本,该命令会首先找到cmd.bat文件,然后再去执行cmd.bat文件,而该文件

为EditText设置OnTouchListener事件监听

在项目中需要在EditText输入前,判断某个值是否已经有值,有才可以输入,为NULL值则提示不让输入,先填写指定的编辑框 自己试过监听获取焦点事件,来设置setFocusable(true)或者setFocusable(false);但是没有成功,因为即使后来满足条件了依然无法输入 后来设置了OnTouchListener事件监听,在按下和松开都会触发该事件,会重复执行弹出的吐司,在OnTouchListener事件中因为有 MotionEvent.ACTION_DOWN &MotionEve

android editText 监听事件

在软键盘中注意 在监听的 edittext中 使用android:imeOptions属性的时候,一定要对EditText设置 android:inputType 或者 设置 android:singleline="true" 在activity_main.xml文件中,定义了8个EditText,imeOptions分别是: actionDone 完成 对应 EditorInfo.IME_ACTION_DONE actionGo 前进 对应 EditorInfo.IME_ACTION

android EditText输入变化事件

1 editText.addTextChangedListener(new TextWatcher(){ 2 3 public void afterTextChanged(Editable s) { 4 // TODO Auto-generated method stub 5 //s:变化后的所有字符 6 Toast.makeText(getApplicationContext(), "变化:"+s, Toast.LENGTH_SHORT).show(); 7 } 8 9 public

C语言函数参数压栈顺序为何是从右到左?(从左向右的话,碰到printf的会陷入死循环)

上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系. 由于汇编语言是底层的编程语言,各种函数参数都要直接控制栈进行存取,在混合编程中,要用汇编来调用C函数,当然就要知道参数的压栈情况了. 当知道C函数的参数压栈顺序是从右到左时,我觉得很奇怪,因为大多数情况下,人们的习惯是从左到右的,难不成设计者学咱们中国古代写字从右到左的习惯不成? 当时只是记下了这个规则而已,并没有去探究这其中的缘由,后来在实验中自己用汇编实现了printf和scan

如何解决svn清理失败 不能更新 cleanup失败 cleanup乱码 更新乱码 svn更新提示清理 清理乱码不能清理 svn故障修复SVN cleanup 陷入死循环 svn cleanup时遇到错误怎么办

平时使用svn的过程中,有的时候由于自己操作故障或者系统原因,导致svn不能更新,提示cleanup也不能成功,陷入了死循环 原因是;svn的数据库队列原因 1,下载sqlite3.exe,google一下就有了 2.将下载好的文件放到svn的根目录也就是有svn隐藏文件夹的地方 跟这个文件夹同一个目录即可,如果怎么都找不到,记得显示隐藏的文件夹就可以看到了,不会操作的请google 3.控制台找到sqlite3.exe所在位置 3.1执行:sqlite3 .svn/wc.db "select

Wpf TextChanged事件导致死循环,事件触发循环问题

1.实例: 说明:当TextBox控件的Text内容发生变化时,TextChanged事件触发,并且会立即同步执行. 基于这个特点,设置一个全局变量标识,ChangeTxtB,如果是正在修改txtB的时候,不执行txt_TextChanged事件内容. 这样就可以解决TextChanged事件带来的死循环问题. //比特 private void txtb_TextChanged(object sender, TextChangedEventArgs e) { if (ChangeTxtB) /

不会陷入死循环的快速排序

static void quick_sort(int[] s ,int l, int r) { int i = l, j = r, t, x = s[l]; while (j > i) { while (s[j] >= x && i <j) { j--; } while (s[i] <= x && i<j) { i++; } if (j > i) { t=s[i]; s[i] = s[j]; s[j] = t; } } s[l] = s[