大家对EditText这个控件并不陌生,它是一个可供我们输入文本内容的输入框。前些日子需要实现这样一个需求:限制EditText中可以输入的最大字符数为6,达到6时,用户每按一次软键盘就弹出一个Toast提示用户,并且无法再输入内容。就像下图的效果:
一开始我是直接在布局文件中在使用android:maxLength的属性将文本长度写死,然后再到代码中去监听,但是这样一来,监听也就失去了意义了,因为无论用户怎么输入,EditText中容纳的文本长度最长都是6,超过6时就不起作用了。所以我最终抛弃了这个写法,不再把文本长度写死了。现在就让我们看看具体怎么实现吧。
新建一个工程,在MainActivity的布局里放置一个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="com.lindroid.edittextchangedemo.MainActivity"><EditText
android:id="@+id/edit"android:hint="请在此输入内容"android:layout_width="match_parent"android:layout_height="wrap_content" />
</RelativeLayout>
然后到代码中实现EditText中的输入监听事件,即接口TextWatcher中的方法。由于我们需要监听的是文本长度的变化,也就是文本输入过程中的变化,所以复写onTextChanged方法即可:
public class MainActivity extends AppCompatActivity {private EditText editText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editText = (EditText) findViewById(R.id.edit);editText.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {if (s.length() > 6){ //判断EditText中输入的字符数是不是已经大于6editText.setText(s.toString().substring(0,6)); //设置EditText只显示前面6位字符editText.setSelection(6);//让光标移至末端Toast.makeText(MainActivity.this, "输入字数已达上限", Toast.LENGTH_SHORT).show();return;}}@Overridepublic void afterTextChanged(Editable s) {}});}
}
代码只有寥寥几行,首先我们需要判断用户输入的字符串长度是否已经超过了6(参数CharSequence 即EditText中输入的字符串),如果超过了6,我们就只显示前面6位字符,并弹出一条Toast告诉用户 “输入字数已达上限”,不能再输入了。同时,为了用户操作方便,比如可以删除刚刚输入的内容,我们将光标设置在文本的末端。
好了,整个Demo就这么简单,其实我们就是把用户输入的内容先拦截下来,筛选之后再显示到EditText上而已。
点击下载Demo