如何实现 TextEdit 的 "TextArea" 变体

How to implement a "TextArea" variant of TextEdit

我正在尝试在 android 应用程序中实现 material 文本字段 (https://material.io/components/text-fields) 的使用。

我目前一直在尝试为电子邮件的正文实现这一点。它需要是它的 LinearLayout 的高度和宽度,以便它显示在各种屏幕尺寸上。

我需要解决的问题是,任何输入的文本都被强制放在 TextEdit 垂直中心的一行上,而不是在顶部。我不能让它的高度是单行开头,因为我希望用户能够通过单击大于单行的隐含消息正文区域中的任意位置来输入它。

首先,我似乎无法让 multiLine 功能像一般描述的那样工作。但是即使我可以,我也需要根据它可用的 space 来设置它的大小来填充(取决于屏幕大小)而不是一些任意数量的行。也许我误解了它是如何工作的?

其次,material.io 引用了一个名为 TextArea 的输入类型,它在其他任何地方都没有被引用,甚至 google 也没有帮助发现它。为何如此神秘? (https://material.io/components/text-fields#input-types) 这是一个可能的解决方案还是转移注意力?

下面提供了代码,到目前为止,我已经在谷歌上搜索了很多,所以如果有些东西是多余的或者它的格式很奇怪,我深表歉意,但我很感激任何建议让它发挥作用或帮助我理解我做错了什么。

普通文本编辑版本:

<EditText
        android:inputType="textMultiLine"
        android:singleLine="false"
        android:minLines="6"
        android:lines="10"
        android:maxLines="20"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        
        android:hint="Message"/>

materials.io版本:

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/noticeBody"
        style="@style/DetailNoticeBodyTextView"
        android:padding="10dp"
        android:inputType="textMultiLine"
        android:hint="Message"
        android:gravity="top|left"
        android:textCursorDrawable="@null">
        <com.google.android.material.textfield.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </com.google.android.material.textfield.TextInputLayout>

注意:我也尝试过各种混搭版本,例如。 minLines/maxLines在materials.io版本等

您可以将 inputType 设置为 textMultiLine

代码:

    <com.google.android.material.textfield.TextInputLayout
    android:id="@+id/noticeBody"
    style="@style/DetailNoticeBodyTextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:inputType="textMultiLine"
    android:hint="Message"
    android:gravity="top|left"
    android:textCursorDrawable="@null">
    <com.google.android.material.textfield.TextInputEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:gravity="top|start"
        android:scrollbars="vertical"  >
    </com.google.android.material.textfield.TextInputEditText>
</com.google.android.material.textfield.TextInputLayout>

在紧张的工作日程之外花了一个晚上仔细考虑它,我意识到我遇到的问题是辨别 com.google.android.material.textfield 和常规 TextEdit 之间的约定混合。

下面是 com.google.android.material.textfield 的代码,实现了我的预期。

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/noticeBody"
        style="@style/DetailNoticeBodyTextView"
        android:padding="10dp"
        android:inputType="textMultiLine"
        android:hint="Message"
        android:textCursorDrawable="@null">
        <com.google.android.material.textfield.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="top|left" />
    </com.google.android.material.textfield.TextInputLayout>

与文档一样,文本字段提示、输入类型、填充等都写在 TextInputLayout 部分中。这是我在问题中链接的文档的典型约定。事实上,它明确指出应该在那里设置消息提示以避免意外行为。

然而,重力设置(根据我的经验)在同一部分没有效果,需要在 TextInputEditText 部分中设置。我觉得这种“有时这个和有时那个”对于 Google 材料来说是一个糟糕的外观,但我真的不想进入它。尽管如此,这是对我有用的解决方案。