【问题标题】:Android EditText- maxLengthAndroid EditText-maxLength
【发布时间】:2014-08-01 09:25:26
【问题描述】:

我知道我可以使用

在 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 被填满(这取决于屏幕大小),用户就不能再输入东西了。

【问题讨论】:

  • 如果我理解正确,您希望避免用户在输入 10 个字符时更改文本。对吗?
  • @GabrielNegut 不,不是,我不希望它限制在 10 个字符以内,但我想限制它,以便一旦填充了整个 EditText(这取决于屏幕大小),用户不能再输入内容了。
  • @MarcoAcierno 这不是我想要的,请看我编辑的帖子。

标签: android android-edittext limit maxlength


【解决方案1】:

java代码

  EditText edittext;

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

XML

<EditText
android:maxLength="10"
/>

【讨论】:

    【解决方案2】:

    使用这个

    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. 获取EditText 宽度
      2. 获取文字宽度

      首先,这里的代码并不完美,它允许用户放置超过宽度的部分(可能是因为EditText.getWidth() 将返回带有边框等的值。 ) 这只是提供一个想法。

      关于这个方法的更多问题是,即使我们没有在 EditText 中显示文本,键盘缓冲区仍然会知道这一点,并且会给用户带来不好的影响,我尝试使用 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);
          }
      });
      

      只是为了看看,我尝试使用 measureText 以返回浮点宽度(并使用比较 int 和 float)得到相同的结果:

      @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);
      }
      

      结果几乎一样......

      我玩弄了android:ems="4",它应该提供字体大小(也许可以做一些事情来使它更适合?)但什么都没有(好吧不是,看起来看起来更好但我觉得它完全随机基于词)。

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

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

      【讨论】:

        【解决方案4】:

        您可以使用android:singleLine=true

        【讨论】:

          猜你喜欢
          • 2015-08-26
          • 2012-01-09
          • 2014-11-12
          • 2017-07-27
          • 1970-01-01
          • 1970-01-01
          • 2012-09-01
          • 2021-07-12
          • 2016-02-28
          相关资源
          最近更新 更多