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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • eclipse引入jar包_eclipse导入maven项目

    eclipse引入jar包_eclipse导入maven项目第一步:创建lib文件夹,统一存放需要导入的jar包第二步:将jar复制粘贴到lib文件夹内第三步:选中jar,右键—–》BuildPath—–》AddtoBuildPath然后就可以开心的写和执行代码了

    2025年8月23日
    2
  • win10安装Pytorch【最新版】

    win10安装Pytorch【最新版】

    2021年7月8日
    68
  • 记一次CTF的USB流量分析

    记一次CTF的USB流量分析最近在研究鼠标流量,找到如下的文章:https://www.cnblogs.com/hackxf/p/10670844.html根据这个师傅的说法,不同的鼠标抓到的流量不一样,一般的鼠标流量是四个字节,第一个字节表示按键指示左键右键,第二个字节表示水平位移,为正(小于127)是向右移动,为负(补码负数,大于127小于255)是向左移动。第三个字节表示垂直位移,为正(小于127)是向上移动,为负…

    2022年5月29日
    181
  • strtok独到深刻的讲解「建议收藏」

    strtok独到深刻的讲解「建议收藏」strtok函数的使用是一个老生常谈的问题了。该函数的作用很大,争议也很大。以下的表述可能与一些资料有区别或者说与你原来的认识有差异,因此,我尽量以实验为证。交代一下实验环境是必要的,winxp+vc6.0,一个极端平民化的实验环境。本文中使用的源代码大部分来自于网络,我稍加修改作为例证。当然,本人水平有限,有不妥之处在所难免,各位见谅的同时不妨多做实验,以实验为证。strtok的

    2022年7月14日
    17
  • matlab_dock是什么意思

    matlab_dock是什么意思Mac电脑Dock是什么意思,Dock怎么用?个人总感觉,不能原谅我们自己的惰性!遇到问题自己想办法独立解决,解决不了,可以想办法求助搜索引擎。如果连这也做不到,那实在是无可救药了!下面Mac电脑Dock是什么意思,Dock怎么用的内容,就是笔者,求助搜索引擎,并自己实践的结果,弄清楚之后,还是有一点点成就感的,如果您同意笔者的观点,不妨多抽出点时间,来北海亭逛逛,欢迎您谈谈个人想法!一、Mac电…

    2025年11月1日
    4
  • gridbaglayout布局_gridsearch

    gridbaglayout布局_gridsearch自己想做个小程序,却在布局上犯了难,使用FlowLayout和BorderLayout这些功能不够强大,使用GridBagLayout却不会,只好求助于文档了。文档对这个布局管理器介绍很详细,但是最痛苦的是英文。不过幸好它有实例,经过在网上查阅和推敲实例,终于对GridBagLayout的使用有了一个成型的了解,拿出来与大家分享。GridBagLayout是一个灵活的布局管理器,部件如果想

    2025年10月11日
    2

发表回复

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

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