您的位置:首页 > 其它

TextWatcher学习

2015-07-18 20:08 211 查看
<?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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: