2017-08-31 132 views
0

我正在尋找一種方法來根據EditText的寬度限制文本的長度(類似於maxLength,但是是動態的)。Android限制長度到EditText的寬度

一個示例是,長度600px(dpi 3.5)的EditText最多可以有10個m,但最多可以有10個i

iOS的UITextField的答案也非常讚賞。

回答

0

試試這個:

editText.addTextChangedListener(new TextWatcher() { 
      @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) { 
       Rect bounds = new Rect(); 
       Paint textPaint = editText.getPaint(); 
       textPaint.getTextBounds(editText.getText().toString(), 0, editText.getText().toString().length(), bounds); 
       int width = bounds.width(); 
       if (width > max_width) { 
        editText.setText(editText.getText().toString().substring(0, editText.getText().toString().length() - 1)); 
       } 

      } 
     }); 
+0

我已經做幾乎同樣的事情'editText.measuredWidth'但和'paint.measureText()',但似乎有一些填充添加... –

+0

請完全按照上述解決方案,讓我知道它是否適合你 –

+0

我可以確認從'.getTextBounds()'的寬度是正確的,這個東西是你前面的變量'max_width'充足的需要被計算。我正在使用'measuredWidth',但似乎正在改變。根據什麼計算得出 –

0

安東尼的解決方案是正確的,我想和大家分享的完整版本:

val dpi = context.resources.displayMetrics.density 
RxTextView.afterTextChangeEvents(editText) 
     .debounce(300L, TimeUnit.MILLISECONDS) 
     .map { it.editable().toString() } 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe { 
      editText.measure(0, 0) 
      val width = editText.width - 4 * dpi 
      val textWidth = editText.paint.measureText(it) 
      if (width > textWidth) { 
       // get the data 
      } else { 
       editText.setText(it.dropLast(1)) 
       editText.setSelection(if (it.length > 1) it.length - 1 else 0) 
      } 
     } 
     .addTo(composite) 
+0

我相信editText.measure(0,0)是不需要的。很高興它的工作:) –

+1

謝謝,我必須在'afterTextChanged'裏面調用它,否則'''寬度''0' –