Android 当高度大于屏幕时,TextInputLayout 写焦点问题

Android TextInputLayout writing focus issue when height is bigger than the screen

我有一个像这样的 TextInputLayout:

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/textInputLayout"
        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="200dp">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/textInputLayoutEdit"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="200dp"
            android:gravity="top" />
</com.google.android.material.textfield.TextInputLayout>

此 TextInputLayout 的高度是动态的,因为当写入更多文本时,高度会增加。因此,在高度变得大于屏幕并且需要滚动才能看到 TextInputLayout 的第一行的情况下,写入焦点会出现问题。当一直写在顶部时,屏幕焦点将一直到底部,而光标仍在顶部。这使我无法看到顶部写的内容,因为屏幕正在滚动到 TextInputLayout 的底部。有时焦点会回到顶部,几乎就像一个闪烁的小故障。

在底部书写正常,因为底部屏幕焦点始终优先。当 TextInputLayout 的高度还没有超过屏幕时写在顶部,也可以正常工作,因为不需要滚动。

有没有 属性 我需要在 TextInputLayout 中设置,以使屏幕聚焦在我写的地方?

更新 1:

这似乎与键盘始终位于 TextInputLayout 底部的正下方有关。所以打字时,键盘总是希望在底部,而在顶部书写只会将屏幕焦点一直拉到键盘所在的底部。

防止键盘固定在 TextInputLayout 下的一种方法是在 Activity (AndroidManifest.xml) 中设置以下内容:

android:windowSoftInputMode="adjustPan"

这将避免键盘向上强制布局以适应它的需要。这将解决我在写作时被“一路下拉”的问题,即使我正在写作由于高度大,顶部和底部一直不可见。但是......像这样固定键盘会阻止我看到我在底部写的东西,因为键盘挡住了我正在写的东西。所以理想情况下,我还是希望键盘自动在键盘底部做space,同时又不希望键盘把屏幕焦点一路拉下来

更新 2(已解决):

我设法解决了这个问题,解决方案可以在下面的回答中看到。

TL;DR,在TextInputEditText中添加如下内容:

app:textInputLayoutFocusedRectEnabled="false"

maxLines 属性 添加到您的 TextInputEditText 并将 inputType 属性 设置为 textMultiLine,如下所示:

<com.google.android.material.textfield.TextInputEditText
            android:id="@+id/tiet_hisab_description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:maxLines="2"
            android:hint="@string/details"
            android:inputType="textAutoCorrect|textMultiLine|textAutoComplete"
            android:textAppearance="@style/TextAppearance.AppCompat.Small" />

在尝试了 TextInputLayout 的许多属性后,我设法找到了解决方案。关键是设置 app:textInputLayoutFocusedRectEnabled 为 false,在 TextInputEditText:

app:textInputLayoutFocusedRectEnabled="false"

这将有可能实现我想要的 TextInputLayout,即:

  • 能够在根据输入长度增长的 TextInputLayout 中写入文本。
  • 能够在输入字段的任何位置书写(在文本很长的情况下),并且不会被一直拖到底部,因为键盘正试图放置在 TextInputLayout 下方。 (或者它也可以看起来像“故障”,通过将屏幕拉到 TextInputLayout 的中间或一直到底部,从您正在写的地方。就像屏幕上下滚动非常快对于您键入的每个字符。)
  • 能够将键盘放在整个 TextInputLayout 的任何位置,以及 TextInputLayout 的正下方,就像键盘将整个布局向上推一样。

希望我的问题的这个答案能够帮助其他寻找我运行具体问题的人!