EditText限制输入的字符数并弹出Toast提示字数已达上限

大家对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;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.edit);
        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (s.length() > 6){ //判断EditText中输入的字符数是不是已经大于6
                    editText.setText(s.toString().substring(0,6)); //设置EditText只显示前面6位字符
                    editText.setSelection(6);//让光标移至末端
                    Toast.makeText(MainActivity.this, "输入字数已达上限", Toast.LENGTH_SHORT).show();
                    return;
                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
    }
}

代码只有寥寥几行,首先我们需要判断用户输入的字符串长度是否已经超过了6(参数CharSequence 即EditText中输入的字符串),如果超过了6,我们就只显示前面6位字符,并弹出一条Toast告诉用户 “输入字数已达上限”,不能再输入了。同时,为了用户操作方便,比如可以删除刚刚输入的内容,我们将光标设置在文本的末端。

好了,整个Demo就这么简单,其实我们就是把用户输入的内容先拦截下来,筛选之后再显示到EditText上而已。

点击下载Demo

你可能感兴趣的:(android,控件)