Android 将 EditText 限制为 3 行

Android Limit EditText to 3 lines

我们有两个 edittext 小部件,一个限制为 1 行,另一个我们试图将其限制为 3 行。下面发布的 XML 代码适用于 1 行的限制,3 行的限制失败。我有一个不太优雅的解决方案,只使用 3 个单行 edittext 小部件。我的所有研究都指向使用关键监听器或文本观察器来进一步讨论键盘类型。无论哪种方式,我的能力水平都不确定如何为这些受支持的解决方案编写代码或将代码放在哪里。我们想知道如何解决这个 maxLines = 3 输入问题。 最佳 Link HERE

    <EditText
    android:layout_width="300dp"
    android:layout_height="wrap_content"
    android:ems="10"
    android:id="@+id/etSecAnswer"
    android:layout_marginStart="140dp"
    android:layout_marginTop="230dp"
    android:textStyle="bold"
    android:textSize="16sp"
    android:maxLines="1"
    android:inputType="text"
    android:textColor="@color/color_Black"/>

<EditText
    android:layout_width="420dp"
    android:layout_height="wrap_content"
    android:ems="10"
    android:id="@+id/etNotes"
    android:layout_marginTop="260dp"
    android:layout_marginLeft="140dp"
    android:textStyle="bold"
    android:textSize="16sp"
    android:textColor="@color/color_Black"
    android:maxLines="3"
    android:inputType="text|textMultiLine" />

是的,不幸的是 maxLines 实际上对应于 EditText 的外部高度(多少行可见)而不是字段内的实际文本(限制实际键入的文本)。

但是您可以获得输入的行数和 //do something,例如删除最后一行而不必 write/handle 三行分开 EditTexts

像这样获取计数:

if(yourText.getLayout().getLineCount() > lineLimit;){
    //do something like delete last
}

试试下面的代码

android:lines="3"

下面是 getLineCount 的一小段代码,但真正的问题是获得计数后要做什么?我不喜欢可编辑的 属性 它会使视图变灰,所以这里说的是我发现要锁定和解锁 EditText 的一个小概念,试一试

锁定 EditText

    etNotes.setInputType(InputType.TYPE_NULL);
    etNotes.setFocusable(false);

解锁 EditText

    etNotes.setInputType(InputType.TYPE_CLASS_TEXT);
    etNotes.setFocusableInTouchMode(true);
    etNotes.setFocusable(true);
    etNotes.requestFocus();

在onCreate中定义监听器

    int L;
private void addTextChangedListener() {
    etNotes.addTextChangedListener(new TextWatcher() {

        public void afterTextChanged(Editable s) {
        }

        public void beforeTextChanged(CharSequence q, int s, int c, int a) {
        }

        public void onTextChanged(CharSequence q, int s, int b, int c) {
            Log.d("TESTING", " LINES = " + etNotes.getLineCount());
            System.out.println("Line Count "+etNotes.getLineCount());

            L = etNotes.getLineCount();
            if(L > 3){
                etNotes.getText().delete(etNotes.getSelectionEnd() - 1,etNotes.getSelectionStart());
                //etNotes.append("\b");
                //L = 0;
                etNotes.setEnabled(false);

            }
        }
    });
}

让我们知道它是如何工作的,以便其他人可以从 posted 的答案中受益 我已经看到 9000 post 回溯得太远和当前的 post 我只看到大约 15 个有合理的答案,很高兴看到下面的站点扩展这个问题 CodePath Android Cliffnotes

下面的代码片段可能对您有所帮助。虽然它是在 Kotlin 中,但您也可以考虑对您的 java 代码进行类似处理。

// we are checking for line count we need to keep and according to that we are defining inputType dynamically.
val lineCount = placeHolder.numberOfLines
if (lineCount > 1) {
    edtCaption.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE
} else {
    edtCaption.inputType = InputType.TYPE_CLASS_TEXT
}

// we are setting flag of  single line false.
edtCaption.setSingleLine(false)

// here, we are deleting the text if it exceeds the max lines we defined.
edtCaption.addTextChangedListener(object : TextWatcher {
    override fun beforeTextChanged(charSequence: CharSequence, i: Int, i2: Int, i3: Int) {}
    override fun onTextChanged(charSequence: CharSequence, i: Int, i2: Int, i3: Int) {}

    override fun afterTextChanged(editable: Editable) {
        if (null != edtCaption.layout && edtCaption.layout.lineCount > lineCount) {
            edtCaption.text.delete(edtCaption.text.length - 1, edtCaption.text.length)
        }
    }
})

最终,它将允许我们限制用户输入我们认为的确切行。