我也挣扎了好久,终于找到了解决办法!
只需创建一个自定义的 EditText 类:
public class EditTextImeMultiline extends EditText {
public void init() {
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
for (int i = s.length(); i > 0; i--)
if (s.subSequence(i - 1, i).toString().equals("\n"))
s.replace(i - 1, i, "");
}
});
setSingleLine();
setHorizontallyScrolling(false);
this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
EditTextImeMultiline.this.setLines(EditTextImeMultiline.this.getLineCount());
}
});
}
public EditTextImeMultiline(Context context) {
super(context);
init();
}
public EditTextImeMultiline(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public EditTextImeMultiline(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public EditTextImeMultiline(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
}
这个类删除了 lineBreaks (\n),像 textMultiline 一样包裹文本,并且允许你用 ImeAction 替换 Enter 按钮;)。
你只需要在你的 XML 中调用它而不是经典的 EditText 类。
这里解释一下逻辑:
- 将 EditText 设置为 singleLine 以便能够显示 ImeAction 按钮而不是 Enter。
- 移除水平滚动以使文本在到达视图末尾时转到下一行。
- 使用onGlobalLayoutListener 观察布局变化,并将其“line”参数设置为editText 持有的当前文本的“lineCount”。这就是刷新它的高度。