ฉันต่อสู้มาพอสมควร แต่ในที่สุดฉันก็พบวิธีแก้ปัญหา!
เพียงสร้างคลาส 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 ทำได้และช่วยให้คุณสามารถแทนที่ปุ่ม Enter ด้วย ImeAction;)
คุณต้องเรียกมันใน XML ของคุณแทนคลาส EditText แบบคลาสสิก
เพื่ออธิบายตรรกะที่นี่:
- ตั้งค่า EditText เป็นบรรทัดเดียวเพื่อให้สามารถแสดงปุ่ม ImeAction แทน Enter
- ลบการเลื่อนแนวนอนเพื่อให้ข้อความไปที่บรรทัดถัดไปเมื่อถึงจุดสิ้นสุดของมุมมอง
- ดูการเปลี่ยนแปลงเค้าโครงด้วย onGlobalLayoutListener และตั้งค่าพารามิเตอร์ "line" เป็น "lineCount" ของข้อความปัจจุบันที่แก้ไขโดย editText นี่คือสิ่งที่ช่วยฟื้นฟูความสูงของมัน