Android EditText- maxLength

时间:2014-08-01 09:25:27

标签: android android-edittext limit maxlength

我知道我可以使用

在EditText中设置输入文本的最大长度
android:maxLength="10".

但我是否也可以设置最大长度,以便在整个EditText填充文本后,用户不能再输入任何内容了?

这样的事情:

|_________________________|   <-- empty EditText   

|texttexttexttext_________|   <-- user can still type in text

|texttexttexttexttexttextt|  <-- that's it, user can't type in stuff anymore

我怎么能做到这一点?

修改 换句话说:我不希望它仅限于10个字符,但我想限制它,以便一旦填充整个EditText(这取决于屏幕大小),用户就不能再输入内容了。 / p>

4 个答案:

答案 0 :(得分:4)

java代码

  EditText edittext;

  edittext.setFilters(new InputFilter[]{new InputFilter.LengthFilter(20)});

XML

<EditText
android:maxLength="10"
/>

答案 1 :(得分:0)

那么,我认为这可能是一种方法:

  1. 获取EditText宽度
  2. 获取文字宽度
  3. 在此之前,这里的代码并不完美,它允许用户放置一些比宽度更多的东西(可能是因为EditText.getWidth()将返回带边框的值等等。这只是一个想法。

    关于这个approch的更多问题是,即使我们没有在EditText中显示文本,键盘缓冲区仍然会知道它并且它将为用户创建一个不好的效果,我试图使用{ {1}}但结果是一样的(嗯,它更多的是错误)。

    InputFilter

    只是为了看,我试图使用private int widthEditText; // [...] in onCreate: final EditText editText = (EditText) findViewById(R.id.text); // p.s in onCreate the layout is not created yet, so i should wait to read the width editText.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { widthEditText = editText.getWidth(); } }); editText.addTextChangedListener(new TextWatcher() { private String previousText; @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { Paint paint = editText.getPaint(); Rect rectangle = new Rect(); /* i used getTextBounds instead of measureText because it will return the float value but getWidth of * edit text is a int. */ paint.getTextBounds(editable.toString(), 0, editable.length(), rectangle); Log.d(TAG, "Text width: " + rectangle.width()); if (rectangle.width() > widthEditText) { /* the user cannot type anymore */ Log.d(TAG, widthEditText + " > " + rectangle.width() + " blocked."); editable.replace(0, editable.length(), previousText); return; } previousText = editable.toString(); Log.d(TAG, "Continue to write, new previousText: " + previousText); } }); 返回float中的宽度(并使用比较int和float)和相同的结果:

    measureText

    结果非常相似......

    我玩@Override public void afterTextChanged(Editable editable) { Paint paint = editText.getPaint(); // Rect rectangle = new Rect(); /* i used getTextBounds instead of measureText because it will return the float value but getWidth of * edit text is a int. */ // paint.getTextBounds(editable.toString(), 0, editable.length(), rectangle); float width = paint.measureText(editable.toString()); Log.d(TAG, "Text width: " + width); if (width > widthEditText) { /* the user cannot type anymore */ Log.d(TAG, widthEditText + " > " + width + " blocked."); editable.replace(0, editable.length(), previousText); return; } previousText = editable.toString(); Log.d(TAG, "Continue to write, new previousText: " + previousText); } 应该提供字体大小(也许可以做些什么来使它更合适?)但没有(好吧不是,看起来好像它看起来更好但我觉得它完全是随机的在单词)。

    就个人而言,我会避免这种情况,因为对我而言,这听起来有点随机......也许存在一个更好的approch,我不知道..

    我用三星S4设备测试过,所以我不知道它是否适用于其他设备!对此抱歉,但Genymotion不起作用

答案 2 :(得分:0)

使用此

yourEditText.addTextChangedListener(new TextWatcher(){

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub

            if(yourEditText.getText().toString().length()>=10){
                yourEditText.setEnable(false)
            }


        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }

答案 3 :(得分:-1)

您可以使用android:singleLine=true