使用TextWathcer限制EditText控件输入字符个数。
页面布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="pp.org.vincent.glibdemo.MainActivity">
<!-- 使用TextWathcer实现EditeText和TextView同步 -->
<LinearLayout
android:id="@+id/ll_synsa"
android:layout_below="@+id/iv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true">
<EditText
android:id="@+id/ET"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<TextView
android:id="@+id/IV"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
<!-- 使用TextWathcer限制输入字符个数 -->
<LinearLayout
android:id="@+id/ll_limit"
android:layout_below="@+id/ll_synsa"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true">
<EditText
android:id="@+id/ET_limit"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<TextView
android:id="@+id/IV_limit_show"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
</RelativeLayout>
editText_limit= (EditText) findViewById(R.id.ET_limit);
textView_limit=(TextView)findViewById(R.id.IV_limit_show);
//限定这个edittext的字符数量为10个
editText_limit.addTextChangedListener(new TextWatcher() {
public CharSequence oldString;
private int editStart ;
private int editEnd ;
/**
* s 是edittext更改前的字符串引用(注意是引用),参数表示从下标start的count个字符串被被后来的after个字符代替
* 从s中可以寻找到被替换的字符串
* @param s 代表更改前的字符串 S
* @param start 字符串更改的位置
* @param count 更改字符个数
* @param after 代替的新字符个数
*/
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Toast.makeText(MainActivity.this,"beforeTextChanged:"+s,Toast.LENGTH_SHORT).show();
oldString = s;
//注意这个oldString只是指向edittext文本实例的一个引用,并不是一个new出来的String实例
//所以当edittext原来是空,输入一个字符这里输出的oldString为空,length()为0;但是
//afterTextChanged接口方法里面他会获得更改后的文本,所以oldString所指向的实例就被改变了。可以看到
//length()为1
Toast.makeText(MainActivity.this,"oldString.length()"+oldString.length()+"",Toast.LENGTH_LONG).show();
}
/**
* 这个方法在edittext文本框文本改变后调用
* s是更改后的字符串,表示从start下标开始的count个字符代替原来的before个字符
* 从这个回调函数可以获取新插入字符串内容
* @param s s 表示更改后的新字符
* @param start 插入的字符串在s串中start下标开始的一个字符串,有count个长度
* @param before
* @param count
*/
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
/*Toast.makeText(MainActivity.this,
"new string: "+s.subSequence(start,start+count) +"start :"+start+"count: "+count+"before: "+before, Toast.LENGTH_SHORT)
.show();*/
textView_limit.setText(s);
}
/**
* 这个方法在edittext文本框文本改变后调用
* 任何edittext文本的改变都会回调这个方法,在这个方法里面可以改变edittext的文本,但是要注意
* 防止死循环。
* @param s
*/
@Override
public void afterTextChanged(Editable s) {
editStart = editText_limit.getSelectionStart();//返回光标当前的起止位置
editEnd = editText_limit.getSelectionEnd();//返回光标当前的结束位置,但是和上面的一样啊,
Toast.makeText(MainActivity.this,"aftTeChang oldString.length()"+oldString.length()+""+":"+oldString.toString(),Toast.LENGTH_LONG).show();
//限制不能超过10个字符,oldString指向edittext文本框文本实例的引用
if (oldString.length() > 10) {
Toast.makeText(MainActivity.this,
"你输入的字数已经超过了限制!"+"editStart: "+editStart+"editEnd: "+editEnd, Toast.LENGTH_SHORT)
.show();
s=s.delete(editStart-1, editEnd);//删除多出来的那个字符
int tempSelection = editStart;
editText_limit.setText(s);
editText_limit.setSelection(tempSelection);
}
}
});
将edittext中的内容同步到textview
//edittext同步到textview
editText.addTextChangedListener(new TextWatcher() {
/**
*
* @param s 改变字符串的原来情况
* @param start 内容被改变的开始位置
* @param count 原始文字被删除的个数 总start和count可以获取到删除的字符串,这个删除的字符串被after个字符替代
* @param after 新添加的字符串
*/
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.d(TAG,"string: "+s+"Start: "+start+"count: "+count+"after: "+after);
}
/**
*
* @param s 改变后的新文本
* @param start 改变的开始位置
* @param before 原来文字删除的字符
* @param count 总共增加了 几个字符,总start开始的count个字符替换了原来的before个字符
* start和count结合从s中获取新添加的字符内容
*/
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.d(TAG,s.toString());
//用新的文本同步到textview控件
if (!TextUtils.isEmpty(editText.getText()))
{
textView.setText(editText.getText().toString());
}
else { //Toast.makeText(MainActivity.this,"edittext is null",Toast.LENGTH_LONG).show();
textView.setText("");
}
}
@Override
public void afterTextChanged(Editable s) {
//s 改变后的最终内容
Log.d(TAG,"afterTextChanged :"+s.toString());
if (TextUtils.isEmpty(editText.getText())){
textView.setText("");
}
}
});
作者:JQ_AK47 发表于2016/10/22 22:17:35 原文链接
阅读:84 评论:0 查看评论