我知道我可以使用
在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>
答案 0 :(得分:4)
java代码
EditText edittext;
edittext.setFilters(new InputFilter[]{new InputFilter.LengthFilter(20)});
XML
<EditText
android:maxLength="10"
/>
答案 1 :(得分:0)
那么,我认为这可能是一种方法:
EditText
宽度在此之前,这里的代码并不完美,它允许用户放置一些比宽度更多的东西(可能是因为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