如何在新的 android 设计库中使用 TextInputLayout

Posted

技术标签:

【中文标题】如何在新的 android 设计库中使用 TextInputLayout【英文标题】:How to use TextInputLayout in new android design library 【发布时间】:2015-08-14 19:12:27 【问题描述】:

最近google推出了新的android设计库,介绍了如何使用TextInputLayout字段来启用EditText的Floating Hint功能。

here 提供的指导不多。

这个页面说

您现在可以将其包装在 TextInputLayout 中

但不知道,因为智能预测 (Ctrl+SPACE) 不会预测 TextInputLayout 的任何属性。所以我的问题是:

我们如何获取该组件底层的 EditText?

我们如何从 EditText 中获取数据?

【问题讨论】:

问题清晰有用... 这个问题很清楚也很有用,因为设计库的实现没有太多可用的指南! 检查this tutorial,很有帮助。 【参考方案1】:

经验法则:TextInputLayout 应该包装 TextInputEditText 而不是普通的 EditText。

原因? TextInputEditText 是 EditText 的子类,旨在用作 TextInputLayout 的子类。

此外,使用 EditText 会向我们发出警告:添加的 EditText 不是 TextInputEditText。请改用该类。

【讨论】:

【参考方案2】:

Material Components Library 有一个新的TextInputLayout 组件。

只需使用:

<com.google.android.material.textfield.TextInputLayout
    android:layout_
    android:layout_
    android:hint="@string/hint_text">

  <com.google.android.material.textfield.TextInputEditText
      android:layout_
      android:layout_/>

</com.google.android.material.textfield.TextInputLayout>

在official doc你可以找到所有的信息。

【讨论】:

【参考方案3】:

正确的方法...

<android.support.design.widget.TextInputLayout
                android:layout_
                android:layout_
                android:padding="10dp">

            <android.support.design.widget.TextInputEditText
                android:id="@+id/card_id_edit_text"
                android:layout_
                android:layout_
                android:hint="@string/form_card_id_text"
                android:inputType="number"
                android:maxLength="10"/>
        </android.support.design.widget.TextInputLayout>

如果您像 TextInputLayout 的子项一样使用 EditText,您将在 Android Monitor 中看到此消息:

I/TextInputLayout:添加的 EditText 不是 TextInputEditText。请改用该类。

【讨论】:

【参考方案4】:

我们也可以使用 AppCompactEditText 来添加支持:appcompat in gradle

 <android.support.design.widget.TextInputLayout
    android:layout_
    android:layout_
    android:layout_margin="20dp">

    <android.support.v7.widget.AppCompatEditText
        android:id="@+id/et_name"
        android:layout_
        android:layout_
        android:hint="@string/hint"
        android:maxLength="100"
        android:inputType="textNoSuggestions"
        android:textColor="@color/colorPrimary"
        android:textSize="@dimen/font_size_large" />

</android.support.design.widget.TextInputLayout>

【讨论】:

【参考方案5】:

请将TextInputLayout 包裹在TextInputEditText 周围,而不是EditText

环绕EditText 在横向模式下确实存在问题。参考 this article 了解更多详情。

<android.support.design.widget.TextInputLayout
     android:layout_
     android:layout_>

     <android.support.design.widget.TextInputEditText
        android:layout_
        android:layout_
        android:hint="hint"
        android:id="@+id/editText1" />

</android.support.design.widget.TextInputLayout>

【讨论】:

【参考方案6】:
<android.support.design.widget.TextInputLayout
    android:id="@+id/til_message"
    android:layout_
    android:layout_>

    <EditText
        android:id="@+id/et_message"
        android:layout_
        android:layout_
        android:hint="@string/type_message"
        android:maxLines="5"/>

</android.support.design.widget.TextInputLayout>

一旦您开始输入编辑文本,提示将自动向上移动,并且出现在文本输入布局上的编辑文本集错误下方出现的错误,例如不是在编辑文本上

tilMessage.setError("Message field is empty!");

禁用错误

tilMessage.setErrorEnabled(false);

【讨论】:

【参考方案7】:

为了使其正常工作,您应该让您的应用主题从 Theme.AppCompat(或其后代)主题扩展,就像从 Theme.AppCompat.Light.NoActionBar 扩展一样。

【讨论】:

【参考方案8】:

这是在“用于编辑文本的浮动标签”下的design support library 中定义的。

     <android.support.design.widget.TextInputLayout
            android:id="@+id/name_et_textinputlayout"
            android:layout_
            android:layout_
            android:layout_marginTop="@dimen/activity_vertical_margin">

            <EditText
                android:id="@+id/FeedBackerNameET"
                android:layout_
                android:layout_
                android:hint="hinttext"
                android:inputType="textPersonName|textCapWords" />
     </android.support.design.widget.TextInputLayout>

【讨论】:

【参考方案9】:

TextInputLayout 扩展 ViewGroup 类。 因此,这意味着您必须将您的 EditText 包装在 TextInputLayout 中。

<android.support.design.widget.TextInputLayout
     android:layout_
     android:layout_>

     <EditText
        android:layout_
        android:layout_
        android:hint="hint"
        android:id="@+id/editText1" />

</android.support.design.widget.TextInputLayout>

【讨论】:

@moictab 它在设计支持库中,因此适用于 API 7+。 好吧,我已经在 API 19 中尝试过,但在膨胀视图时出现异常。也许我做错了什么。 我已经尝试过您的解决方案并在我的棒棒糖设备上运行它,但 TextInputLaayout 不起作用 @moictab 确保将 compile 'com.android.support:design:22.2.0' 添加到您的 gradle 依赖项中。 TextInputLayout 真的很好。我只是在这里遵循本指南>>charmndroid.blogspot.in/2015/06/…。它说你必须初始化 TextInputLayout 而不是 EditText 然后控制!

以上是关于如何在新的 android 设计库中使用 TextInputLayout的主要内容,如果未能解决你的问题,请参考以下文章

即使在新的克隆存储库中,Github 桌面也会在 >>> HEAD 中恢复提交结果

Android 如何在新的 sdk 3.0 中与 Facebook Open Graph 共享数据?

如何在新的 Google Play 控制台中停用所有旧版本的 APK?

在新的 Navigation Drawer Activity 模板中使用 onNavigationItemSelected 在 Fragments 之间切换(Android Studio 1.4 及更

在新的 Android Studio 3.1 上构建时出错

如何在新的 Facebook 开发者中禁用应用程序的沙盒模式?