TextWatcher学习[通俗易懂]

xmlversion=”1.0″encoding=”utf-8″?>LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”android:orientation=”vertical”android:layout_width=”fill_parent”android:layout_heig

大家好,又见面了,我是你们的朋友全栈君。<?
xml version=”1.0″ encoding=”utf-8″
?>


<
LinearLayout
 
xmlns:android
=”http://schemas.android.com/apk/res/android”

android:orientation

=”vertical”

android:layout_width

=”fill_parent”

android:layout_height

=”fill_parent”



>


<
TextView
 
android:id
=”@+id/tv”

android:layout_width

=”fill_parent”
 

android:layout_height

=”wrap_content”
 

android:textColor

=”@android:color/white”
 

android:ellipsize

=”marquee”
 

android:focusable

=”true”
 

android:marqueeRepeatLimit

=”marquee_forever”
 

android:focusableInTouchMode

=”true”
 

android:scrollHorizontally

=”true”
 

android:text

=”Please input the text:”



/>


<
EditText
 
android:id
=”@+id/ET”
 

android:layout_width

=”match_parent”
 

android:layout_height

=”wrap_content”

android:inputType

=”number”
/>


</
LinearLayout
>

Java代码:
package com.android.text;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class TextWatcherDemo extends Activity {

    private TextView mTextView;
    private EditText mEditText;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mTextView = (TextView)findViewById(R.id.tv);
        mEditText = (EditText)findViewById(R.id.ET);
        mEditText.addTextChangedListener(mTextWatcher);
    }
    TextWatcher mTextWatcher = new TextWatcher() {

        private CharSequence temp;
        private int editStart ;
        private int editEnd ;
        @Override
        public void beforeTextChanged(CharSequence s, int arg1, int arg2,
                int arg3) {

            temp = s;
        }
      
        @Override
        public void onTextChanged(CharSequence s, int arg1, int arg2,
                int arg3) {

            mTextView.setText(s);
        }
      
        @Override
        public void afterTextChanged(Editable s) {

            editStart = mEditText.getSelectionStart();
            editEnd = mEditText.getSelectionEnd();
            if (temp.length() > 10) {

                Toast.makeText(TextWatcherDemo.this,
                        “你输入的字数已经超过了限制!”, Toast.LENGTH_SHORT)
                        .show();
                s.delete(editStart-1, editEnd);
                int tempSelection = editStart;
                mEditText.setText(s);
                mEditText.setSelection(tempSelection);
            }
        }
    };
}
(2)使用

TextWathcer实现EditeText和TextView同步


TextWatcher自身是一个接口,首先需要实现这个接口并覆盖其三个方法,分别为Text改变之前,改变之后以及改变的过程中各自发生的动作相应,这里我们只需要实现EditText在文本发生改变时候让TextView的内容跟着发生变化。

editText.addTextChangedListener(new TextWatcher(){

@Override  
public void afterTextChanged(Editable s) {  
    }  
@Override  
public void beforeTextChanged(CharSequence s,int start,int count,int after){      
    }  
@Override  
public void onTextChanged(CharSequence s, int start, int before, int count) {  
   textView.setText(editText.getText());  
  }  
}); 

可以看出TextWatcher是专门用来监听文本变化的,正因为它的这个技能,正是我们实现同步的功能所需要的











Android的编辑框控件EditText在平常编程时会经常用到,有时候会对编辑框增加某些限制,如限制只能输入数字,最大输入的文字个数,不能输入 一些非法字符等,这些需求有些可以使用android控件属性直接写在布局xml文件里,比如android:numeric=”integer”(只允 许输入数字);

     对于一些需求,如非法字符限制(例如不允许输入#号,如果输入了#给出错误提示),做成动态判断更方便一些,而且容易扩展;

     在Android里使用TextWatcher接口可以很方便的对EditText进行监听;TextWatcher中有3个函数需要重载:

public void beforeTextChanged(CharSequence s, int start, int count, int after); public void onTextChanged(CharSequence s, int start, int before, int count); public void afterTextChanged(Editable s);

     从函数名就可以知道其意思,每当敲击键盘编辑框的文字改变时,上面的三个函数都会执行,beforeTextChanged可以给出变化之前的内容,onTextChanged和afterTextChanged给出追加上新的字符之后的文本;

所以对字符的限制判断可以在afterTextChanged函数中进行,如果检查到新追加的字符为认定的非法字符,则在这里将其delete掉,那么他就不会显示在编辑框里了:

private final TextWatcher mTextWatcher = new TextWatcher() { 

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

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

public void afterTextChanged(Editable s) {

 if (s.length() > 0) { int pos = s.length() – 1; char c = s.charAt(pos); if (c == ‘#’) {//这里限制在字串最后追加# s.delete(pos,pos+1); Toast.makeText(MyActivity.this, “Error letter.”,Toast.LENGTH_SHORT).show(); }

 } }};

     注册监听:

EditText mEditor = (EditText)findViewById(R.id.editor_input); 

mEditor.addTextChangedListener(mTextWatcher);


转载地址:http://czhjchina.blog.163.com/blog/static/2002790472012220113455325/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125623.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月18日 下午2:40
下一篇 2022年4月18日 下午3:00


相关推荐

  • mapbox绘制航线图

    mapbox绘制航线图mapbox 先上效果图再来一段官网描述 MapboxGLJS 是一个 JavaScript 库 它使用 WebGL 以 vectortiles 和 Mapboxstyles 为来源 将它们渲染成互动式地图 它是 MapboxGL 生态系统的一部分 其中还包括 MapboxMobile 它是一个用 C 编写的兼容桌面和移动平台的渲染引擎 P S mapbox 地图展示的大部分信息可以在地图样式里面配置 包括平常的河流 土地 天空等颜色 还有各种建筑是否显示地区名字 中英文等 代码

    2026年3月17日
    1
  • 配置元数据库(可选)

    配置元数据库(可选)

    2026年3月16日
    2
  • 什么是UE4(学ue4还是unity)

    对于游戏的来说,最能够影响它的性能的,便是游戏程序的开发、维护工作了。游戏开发、维护工作都是通过游戏开发引擎来完成的,而U3D和UE4正是如今行业主流的两款游戏开发引擎。不同的游戏开发引擎在不同的游戏中使用,那么具体的u3d和ue4的区别是什么?小编常被想要进入游戏行业的同学问到,学U3D和UE4哪个更好?其实这主要是看你自己的就业倾向。下面小编就从两款游戏开发引擎的具体区别来讲讲我们该如何选择。…

    2022年4月14日
    61
  • 文心一言API接入指南:在项目中高效应用

    文心一言API接入指南:在项目中高效应用

    2026年3月12日
    2
  • Harbor镜像仓库远程同步

    Harbor镜像仓库远程同步

    2021年5月31日
    181
  • IntelliJ IDEA汉化解决方案教程

    IntelliJ IDEA汉化解决方案教程多了不说,少了不唠,直接上操作图:IntelliJIDEA中文汉化包下载传送门:点我下载汉化包  复制粘贴汉化包到安装IntelliJIDEA的lib目录下   …

    2022年6月12日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号