TextWatcher如何找到调用它的EditText

和我在南方一起工作的朋友说,“南北方的差异其实蛮大的。”我家在北方,也在南方工作,不过我倒是觉得差异不怎么大,因为我在北方的时候,就没有女朋友,而来到了南方,同样没有女朋友。

开发时遇到一个问题,如同标题,当一个类继承了TextWatcher时,倘若这个类中有很多EditText控件,那么如何知道调用TextWatcher的是哪一个EditText控件呢?如果一个类继承的是OnClickListener,那可以通过View获取控件的Id值,从而分辨控件,做对应操作。可惜TextWatcher似乎没有类似的方法。我是这样解决的:

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:padding="10dp">

    <EditText
        android:id="@+id/edit1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/edittext_1" />
    <EditText
        android:id="@+id/edit2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/edittext_2" />
    <EditText
        android:id="@+id/edit3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/edittext_3" />
    <EditText
        android:id="@+id/edit4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/edittext_4" />
    <EditText
        android:id="@+id/edit5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/edittext_5" />

</LinearLayout>

很简单,只是写了几个EditText控件。

主类:

package com.example.edittexttest;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class EditTextTest extends Activity {

	EditText edit1, edit2, edit3, edit4, edit5;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_edit_text_test);

		edit1 = (EditText) findViewById(R.id.edit1);
		edit1.addTextChangedListener(new ClassOfTextWatcher(edit1));
		setCursorToEnd(edit1);
		edit2 = (EditText) findViewById(R.id.edit2);
		edit2.addTextChangedListener(new ClassOfTextWatcher(edit2));
		setCursorToEnd(edit2);
		edit3 = (EditText) findViewById(R.id.edit3);
		edit3.addTextChangedListener(new ClassOfTextWatcher(edit3));
		setCursorToEnd(edit3);
		edit4 = (EditText) findViewById(R.id.edit4);
		edit4.addTextChangedListener(new ClassOfTextWatcher(edit4));
		setCursorToEnd(edit4);
		edit5 = (EditText) findViewById(R.id.edit5);
		edit5.addTextChangedListener(new ClassOfTextWatcher(edit5));
		setCursorToEnd(edit5);

	}

	private class ClassOfTextWatcher implements TextWatcher {

		private TextView view;

		public ClassOfTextWatcher(View view) {

			if (view instanceof TextView)
				this.view = (TextView) view;
			else
				throw new ClassCastException(
						"view must be an instance Of TextView");
		}

		@Override
		public void afterTextChanged(Editable s) {

			if (s.length() <= 0) {
				switch (view.getId()) {

				case R.id.edit1:
					Toast.makeText(EditTextTest.this, "第一个编辑框为空!",
							Toast.LENGTH_LONG).show();
					break;
				case R.id.edit2:
					Toast.makeText(EditTextTest.this, "第二个编辑框为空!",
							Toast.LENGTH_LONG).show();
					break;
				case R.id.edit3:
					Toast.makeText(EditTextTest.this, "第三个编辑框为空!",
							Toast.LENGTH_LONG).show();
					break;
				case R.id.edit4:
					Toast.makeText(EditTextTest.this, "第四个编辑框为空!",
							Toast.LENGTH_LONG).show();
					break;
				case R.id.edit5:
					Toast.makeText(EditTextTest.this, "第五个编辑框为空!",
							Toast.LENGTH_LONG).show();
					break;
				default:
					break;
				}
			}
		}

		@Override
		public void beforeTextChanged(CharSequence s, int start, int count,
				int after) {

		}

		@Override
		public void onTextChanged(CharSequence s, int start, int before,
				int count) {

		}

	}

	//将编辑框的光标移动到末尾
	public void setCursorToEnd(EditText text){
		String content = text.getText().toString();
		text.setSelection(content.length());
	}
}

写了一个叫“ClassOfTextWatcher”的内部类,它实现了TextWatcher接口,这个内部类的构造方法中传入View控件来获取控件的Id。

效果图:

时间: 2024-10-29 18:56:21

TextWatcher如何找到调用它的EditText的相关文章

Android 带清除功能的输入框控件EditText

今天学习了自定义控件,然后自己做了一个用户登录小控件EditText,就是在Android系统的输入框右边加入一个小图标,点击小图标可以清除输入框里面的内容,但是Android原生EditText不具备此功能,所以要想实现这一功能我们需要重写EditText. 先说明一下,我是用Android studio写的,代码已经共享到我的github上了,有需要的可以去下载. 我们可以为我们的输入框在上下左右设置图片,所以我们可以利用属性android:drawableRight设置我们的删除小图标,如

android 中如何限制 EditText 最大输入字符数

方法一: 在 xml 文件中设置文本编辑框属性作字符数限制 如:android:maxLength="10" 即限制最大输入字符个数为10 方法二: 在代码中使用InputFilter 进行过滤 //editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(20)}); 即限定最大输入字符数为20 [java] view plaincopy public class TextEditActivity exten

自定义的Android EditText

这是一个指定EditText,在我们的实际开发中,可以直接拿来用就行了,先上图看效果:        简单介绍下:当文本框有字符串时,在右边会显示一个清除的图标.点击清除的图标可以清除文本框的内容. 先上自定义编辑框代码:代码比较简单,值得注意的是onTouchEvent方法.这个是一个触摸事件,主要捕获清除图标,模拟点击事件. 1 package cn.datian.customedit; 2 3 import android.content.Context; 4 import android

android 实现带清除效果的EditText(附带抖动效果)

Android一直没有提供类似于ios中自带清除效果的输入框(ios只要只要添加属性即可实现),所以在Android当中 想要实现此效果就需要使用自定义控件的方式实现. 思路:可以使用一个Linearlayout里面横向布局一个EditText和一个删除的图片,监听输入框的焦点和文字变化,设置图片的显隐和点击清除事件.但是这么做些弊端,首先增加了UI布局的层级结构不利于UI结构的优化而且可能会出现文字过长遮挡住图片的情况.所以采用自定义控件继承于EditText,使用getCompoundDra

Android中CleanEditText自动带X号输入框的EditText

图标在这里.你懂得 实现的效果如下: 今天做项目遇到的问题.记录下.自动带删除按钮的EditText. public class CleanEditText extends EditText implements OnFocusChangeListener, TextWatcher { /** * 删除按钮的引用 */ private Drawable mClearDrawable; public CleanEditText(Context context) { this(context, nu

android 监听EditText 的变化

使用EditText的addTextChangedListener(TextWatcher watcher)方法对EditText实现监听,TextWatcher是一个接口类,所以必须实现TextWatcher里的抽象方法: 当EditText里面的内容有变化的时候,触发TextChangedListener事件,就会调用TextWatcher里面的抽象方法. 布局: <?xml version="1.0" encoding="utf-8"?> <

android 随着认识的去除率EditText(它配备了防抖效果)

Android它没有提供的类似至ios自带的输入框效果清晰(ios简单地只加属性可实现).因此,Android其中 我们要如何实现就需要这种效果用自己的定义的控件实现. 思路:能够使用一个Linearlayout里面横向布局一个EditText和一个删除的图片.监听输入框的焦点和文字变化,设置图片的显隐和点击清除事件.可是这么做些弊端,首先添加了UI布局的层级结构不利于UI结构的优化并且可能会出现文字过长遮挡住图片的情况. 所以採用自己定义控件继承于EditText,使用getCompoundD

【Android进阶学习】监听EditText的变化

之前博客上的有关EditText的文章,只是介绍EditText的一些最基本的用法,这次来深入学习一下EditText. 监听EditText的变化 使用EditText的addTextChangedListener(TextWatcher watcher)方法对EditText实现监听,TextWatcher是一个接口类,所以必须实现TextWatcher里的抽象方法: 当EditText里面的内容有变化的时候,触发TextChangedListener事件,就会调用TextWatcher里面

EditText格式化工具类--ClearEditText

EditText自定义控件 ClearEditText package com.anzi.jmsht.view; import com.anzi.jmsht.ui.R; import android.content.Context; import android.graphics.drawable.Drawable; import android.text.Editable; import android.text.TextWatcher; import android.util.Attribu