我正在尋找一種方法來根據EditText
的寬度限制文本的長度(類似於maxLength,但是是動態的)。Android限制長度到EditText的寬度
一個示例是,長度600px(dpi 3.5)的EditText
最多可以有10個m
,但最多可以有10個i
。
iOS的UITextField
的答案也非常讚賞。
我正在尋找一種方法來根據EditText
的寬度限制文本的長度(類似於maxLength,但是是動態的)。Android限制長度到EditText的寬度
一個示例是,長度600px(dpi 3.5)的EditText
最多可以有10個m
,但最多可以有10個i
。
iOS的UITextField
的答案也非常讚賞。
試試這個:
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));
}
}
});
安東尼的解決方案是正確的,我想和大家分享的完整版本:
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)
我相信editText.measure(0,0)是不需要的。很高興它的工作:) –
謝謝,我必須在'afterTextChanged'裏面調用它,否則'''寬度''0' –
我已經做幾乎同樣的事情'editText.measuredWidth'但和'paint.measureText()',但似乎有一些填充添加... –
請完全按照上述解決方案,讓我知道它是否適合你 –
我可以確認從'.getTextBounds()'的寬度是正確的,這個東西是你前面的變量'max_width'充足的需要被計算。我正在使用'measuredWidth',但似乎正在改變。根據什麼計算得出 –