关闭

Android 文本监听接口TextWatcher详解

标签: android控件watchertextchanged
8427人阅读 评论(0) 收藏 举报
分类:

TextWatcher是一个用来监听文本变化的接口,使用该接口可以很方便的对可显示文本控件和可编辑文本控件中的文字进行监听和修改

TextWatcher接口中定义了三个方法:


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

该方法在文本改变之前调用,传入了四个参数:

  • CharSequence s:文本改变之前的内容
  • int start:文本开始改变时的起点位置,从0开始计算
  • int count:要被改变的文本字数,即将要被替代的选中文本字数
  • int after:改变后添加的文本字数,即替代选中文本后的文本字数

该方法调用是在文本没有被改变,但将要被改变的时候调用,把四个参数组成一句话就是:
在当前文本s中,从start位置开始之后的count个字符(即将)要被after个字符替换掉


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

该方法是在当文本改变时被调用,同样传入了四个参数:

  • CharSequence s:文本改变之后的内容
  • int start:文本开始改变时的起点位置,从0开始计算
  • int before:要被改变的文本字数,即已经被替代的选中文本字数
  • int count:改变后添加的文本字数,即替代选中文本后的文本字数

该方法调用是在文本被改变时,改变的结果已经可以显示时调用,把四个参数组成一句话就是:
在当前文本s中,从start位置开始之后的before个字符(已经)被count个字符替换掉了


public void afterTextChanged(Editable s) {}

该方法是在文本改变结束后调用,传入了一个参数:

  • Editable s:改变后的最终文本

该方法是在执行完beforeTextChanged、onTextChanged两个方法后才会被调用,此时的文本s为最终显示给用户看到的文本。我们可以再对该文本进行下一步处理,比如把文本s显示在UI界面上


实践

使用TextWatcher监听EditText剩余可输入文本字数

有个这样的需求:用户在EditText中只能输入50个字符,在用户输入的同时在UI界面中告诉用户还可输入多少个字符
布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical">

    <!-- 文字输入框 -->
    <EditText
        android:id="@+id/edt_text_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="@drawable/bg_edit_radius"
        android:gravity="top"
        android:maxLength="50"
        android:minLines="5"
        android:padding="10dp"
        android:textColor="@android:color/white"
        android:textSize="20sp"
        />

    <!-- 已输入字数 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="已输入字数:"
            android:textSize="16sp"/>

        <TextView
            android:id="@+id/tv_text_now_sum"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="0"
            android:textColor="#ff0000"
            android:textSize="16sp"/>
    </LinearLayout>

    <!-- 剩余可输入 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="剩余可输入:"
            android:textSize="16sp"/>

        <TextView
            android:id="@+id/tv_text_remain"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="50"
            android:textColor="#ff0000"
            android:textSize="16sp"/>
    </LinearLayout>

</LinearLayout>

在以上布局中,EditText控件使用maxLength=”50”限制可输入字符为50个

需要使用的控件和变量

    /** 输入框 */
    private EditText mTextContentEdt;

    /** 剩余字数 */
    private TextView mTextRemainTv;

    /** 已输入字数 */
    private TextView mTextNowSumTv;

    /** 总可输入字数 */
    private int textRemainAll = 50;

输入框样式图片bg_edit_radius.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke
        android:width="1dp"
        android:color="@android:color/black" />
    <corners android:radius="10dp" />
    <solid android:color="@android:color/darker_gray" />
</shape>

初始化界面

/**
 * 初始化界面
 */
private void initUI() {
      setContentView(R.layout.activity_main);
      mTextContentEdt = (EditText) findViewById(R.id.edt_text_content);
      mTextRemainTv = (TextView) findViewById(R.id.tv_text_remain);
      mTextNowSumTv = (TextView) findViewById(R.id.tv_text_now_sum);
}

给EditText添加监听,MyTextWatcher类为我们自定义的监听类

/**
 * 初始化监听
 */
 private void initListener() {
      mTextContentEdt.addTextChangedListener(new MyTextWatcher());
 }

创建一个自定义的TextWatcher监听类,实现TextWatcher接口

/**
 * 创建自己的TextWatcher监听类
 */
private class MyTextWatcher implements TextWatcher {

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

 }

 @Override
 public void onTextChanged(CharSequence s, int start, int before, int count) {
      // 已经输入的字数
      mTextNowSumTv.setText(String.valueOf(s.length()));
      // 剩余可输入字数
      int remainSum = textRemainAll - s.length();
      mTextRemainTv.setText(String.valueOf(remainSum));
 }

  @Override
 public void afterTextChanged(Editable s) {

 }
}

运行后的效果图

效果图

转载请注明出处:http://blog.csdn.net/zhuwentao2150/article/details/51546773

4
0
查看评论

android的TextView的TextWatcher使用

TextWatcher是一个文本变化监听接口,定义了三个接口,分别是beforeTextChanged,onTextChanged,afterTextCahnged. TextWatcher通常与TextView结合使用,以便在文本变化的不同时机做响应的处理。TextWatcher中三个回调接口都是...
  • sunwolfaaa
  • sunwolfaaa
  • 2015-11-01 23:13
  • 9259

最强理解:Android对EditText输入时设置监听即TextWatcher的用法

最强理解:Android对EditText输入时设置监听即TextWatcher的用法有时我们需要对EditText输入时设置监听,比如对EditText进行格式控制(一般用正则表达式),判断输入的内容是否合法。笔者学习android一般先查看官方文档,在学习本知识点的时候看了一些其他人写的博客,但...
  • CherishTender
  • CherishTender
  • 2016-07-21 14:39
  • 2773

TextWatcher 用法详解

当我们需要对一个编辑框进行一定的限制,比如禁止输入某个字符,禁止错误的的格式等之类的操作时,就有必要用到EditText的时时监听,而TextWatcher就提供了这种功能。 详情请看下边的事例:  1.    implements TextWatcher接口,重写...
  • userzhanghao123
  • userzhanghao123
  • 2014-03-09 14:35
  • 3741

Android EditText TextWatcher 回调方法参数说明

有些时候需要用到TextWatcher来监听EditText的内容变化, 而TextWatcher有三个回调方法, 这三个回调方法在Android的API Document中说的并不是很容易理解, 我尝试用我的思路以及试验解释一下这三个回调方法的参数。 // ******************...
  • chinalwb
  • chinalwb
  • 2017-02-04 18:32
  • 1066

关于android的EditText的监听接口TextWatcher——调色盘例子

在做调色盘的例子时,除了通过按钮点击“+”和“-”来改变rgb的值,还需要能够直接改变EditText的值来调颜色,这个时候需要用到EditText的监听接口TextWatcher。 因为要同时监听三个EditText,所以用一个类TextChange继承TextWatcher。 //对E...
  • interaction_123
  • interaction_123
  • 2017-03-20 16:49
  • 570

TextWatcher() 的用法

实例一: phone_view.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { Log.i(TAG, &...
  • tw19811220
  • tw19811220
  • 2014-09-08 02:17
  • 1704

TextWatcher,还有在其中setText会引起StackOverflowError,银行卡输入四位空一格

一.背景 最近老是用到TextWatcher,其中有些细节老忘记 二.例子 public class MainActivity extends Activity { private EditText et_one; @Override protected void ...
  • u011889786
  • u011889786
  • 2015-11-23 22:44
  • 691

TextWatcher参数理解

class MyTextWatcher implements TextWatcher{ @Override public void afterTextChanged(Editable s) { // s是文本改变后的内容 Log.i("afterTextChanged...
  • u010606478
  • u010606478
  • 2014-11-09 00:39
  • 1809

用TextWatcher限制输入长度并弹出提示

在EditText里面输入,限制输入长度并弹出提示,原本,这是最初级和普遍的需求了,但在细微处却有点小不方便。   方法之一,是在xml中添加限制:maxLength="10"。但是,当用户输入达到或超过限制时没有提示。   方法之二,给EditText添加T...
  • max2005
  • max2005
  • 2017-10-24 00:28
  • 118

Android TextWatcher使用详解

Android TextWatcher详细讲解
  • u010696065
  • u010696065
  • 2016-01-15 14:18
  • 321
    个人资料
    • 访问:339898次
    • 积分:3702
    • 等级:
    • 排名:第10418名
    • 原创:60篇
    • 转载:4篇
    • 译文:0篇
    • 评论:60条
    博客专栏
    文章分类
    最新评论