मैंने काफी समय तक संघर्ष किया, लेकिन आखिरकार मुझे एक समाधान मिल गया!
बस एक कस्टम एडिट टेक्स्ट बनाएं जैसे:
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();
}
}
यह वर्ग लाइन हटाता है (\ n), पाठ को लपेटता है जैसा कि TextMultiline करता है, और आपको ImeAction द्वारा Enter बटन को बदलने की अनुमति देता है;)।
आपको सिर्फ क्लासिक एडिटटेक्स्ट क्लास के बजाय इसे अपने एक्सएमएल में कॉल करने की आवश्यकता है।
यहाँ तर्क समझाने के लिए:
- EditText को सिंगललाइन के रूप में सेट करें, एंटर के बजाय ImeAction बटन दिखाने में सक्षम होने के लिए।
- दृश्य के अंत तक पाठ को अगली पंक्ति में जाने के लिए क्षैतिज स्क्रॉलिंग निकालें।
- OnGlobalLayoutListener के साथ लेआउट में परिवर्तन देखें, और इसे EditText द्वारा आयोजित वर्तमान पाठ के "lineCount" के लिए "लाइन" पैरामीटर सेट करें। यह वही है जो इसकी ऊंचाई को ताज़ा करता है।