Android 文本监听接口TextWatcher详解

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) {

 }
}

运行后的效果图

原文地址:https://www.cnblogs.com/youseiraws/p/8626859.html

时间: 2024-08-29 21:39:58

Android 文本监听接口TextWatcher详解的相关文章

Android绘图监听接口OnPreDrawListener详解

public static interface ViewTreeObserver.OnPreDrawListener 我们先看下API中的定义: 类概述: 为即将绘制视图树时执行的回调函数定义的接口. 共有方法: public abstract boolean onPreDraw () 即将绘制视图树时执行的回调函数.这时所有的视图都测量完成并确定了框架. 客户端可以使用该方法来调整滚动边框,甚至可以在绘制之前请求新的布局. 综上,ViewTreeObserver是用来帮助我们监听某些View的

Android画图监听接口OnPreDrawListener具体解释

public static interface ViewTreeObserver.OnPreDrawListener 我们先看下API中的定义: 类概述: 为即将绘制视图树时运行的回调函数定义的接口. 共同拥有方法: public abstract boolean onPreDraw () 即将绘制视图树时运行的回调函数.这时全部的视图都測量完毕并确定了框架. client能够使用该方法来调整滚动边框,甚至能够在绘制之前请求新的布局. 综上,ViewTreeObserver是用来帮助我们监听某些

【转】Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)>>中,我们 了解了View树的转换过程以及如何设置View的LayoutParams的.本文继续沿着既定轨迹继续未完成的job. 主要知识点如下:                 1.MeasureSpc类说明                 2.measure过程详解(揭秘其细节);   

18.文本监听&插补器

/** * 归属地查询页面 * * @author Kevin * */ public class AddressActivity extends Activity { private EditText etNumber; private TextView tvResult; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVi

Android 4.4 KitKat NotificationManagerService使用详解与原理分析(二)__原理分析

前置文章: <Android 4.4 KitKat NotificationManagerService使用详解与原理分析(一)__使用详解> 转载请务必注明出处:http://blog.csdn.net/yihongyuelan 概况 在上一篇文章<Android 4.4 KitKat NotificationManagerService使用详解与原理分析(一)__使用详解>中详细介绍了NotificationListenerService的使用方法,以及在使用过程中遇到的问题和

Android实习札记(6)---ViewPager使用详解

Android实习札记(6)---ViewPager使用详解                                    --转载请注明出处:coder-pig 札记(5)中介绍了Fragment构建简单的底部导航栏,在结尾的时候说要在下一节中,结合Viewpager 实现进入软件时的引导界面,说到ViewPager,很多朋友都用过,不过只知道粘贴复制,连一些基本的 东西都不知道,那是不行的,在本节中就先讲下ViewPager的一些基本概念吧! 1.首先ViewPager在哪个包下?

Java语言Socket接口用法详解

Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Server,并通过accept()方法随时监听客户端的连接请求. 扩展: ServerSocket中常用的构造函数及方法 构造函数:ServerSocket(int port) 这是一个构造方法,用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口创建一个ServerSocket对象

Android 中的 Service 全面总结详解【下】

上一篇文章Android 中的 Service 全面总结详解[下] 介绍了Service的一些知识以及本地Service的使用,如果对Service还不太了解的建议先看下上篇文章:本文主要接着上一篇讲下远程服务的使用: 在说到远程服务的时候,我们需要先了解一些预备的知识: 首先来了解一下AIDL机制: AIDL的作用 由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象.在Android平台,一个进程通常不能访问另一个进程的内存空间,

Android 多线程之IntentService 完全详解

关联文章: Android 多线程之HandlerThread 完全详解 Android 多线程之IntentService 完全详解 android多线程-AsyncTask之工作原理深入解析(上) android多线程-AsyncTask之工作原理深入解析(下) IntentService 一.IntentService概述 ??上一篇我们聊到了HandlerThread,本篇我们就来看看HandlerThread在IntentService中的应用,看本篇前建议先看看上篇的HandlerT