在TextInputLayout XML中禁用/删除浮动标签提示文本


75

这似乎违反直觉,但是有没有办法禁用或删除其中的浮动标签提示TextInputLayout呢?我想使用TextInputLayout而不是仅使用的原因EditText是针对TextInputLayout提供的计数器。

这是我到目前为止的内容:

<android.support.design.widget.TextInputLayout
            android:id="@+id/textContainer"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            app:counterEnabled="true"
            app:counterMaxLength="100">

            <EditText
                android:id="@+id/myEditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" 
                android:gravity="top|left"
                android:inputType="textMultiLine|textCapSentences"
                android:maxLength="100"
                android:scrollbars="vertical"
                android:hint="This is my cool hint"/>

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

以编程方式最好的主意,您必须提供提示和textChange事件时间在编辑
框中输入

问题是提示颜色。输入内容时变为白色。请更改提示颜色或更改背景颜色。键入时,您将看到提示。
charitha amarasinghe

Answers:


183

您可以调用支持库的23.2.0版开始

setHintEnabled(false)

或将其放在您的TextInputLayout xml中,如下所示:

app:hintEnabled="false"

尽管该名称可能使您认为它删除了所有提示,但它仅删除了浮动提示。

相关文档和问题:http : //developer.android.com/reference/android/support/design/widget/TextInputLayout.html#setHintEnabled(boolean)

https://code.google.com/p/android/issues/detail?id=181590


我也隐藏了该错误,这有点意外(版本27.1.1)
kassim

17
附加说明:为了使它起作用,您需要在上设置提示TextInputEditText。如果您在上设置了提示,TextInputLayout则不会显示。
alexbchr

4
但是,当您设置app:hintEnabled =“ false” :(时,它会在顶部添加一些奇怪的填充。如果您在右侧使用图标,将会引起注意。我已经将paddingTop =“ 12dp”添加到TextInputEditText中,那么看起来不错。
NixSam'5

53

实现此目的可能有三种方法:

1设置android:hintTextInputLayout一个空间_角色,并始终保持android:hint="This is my cool hint"在所设定的EditText

<android.support.design.widget.TextInputLayout
    ....
    ....
    android:hint=" ">       <<----------

    <EditText
        ....
        ....
        android:hint="This is my cool hint"/>    <<----------

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

之所以有效,是因为TextInputLayout在使用EditText's提示之前执行以下检查:

// If we do not have a valid hint, try and retrieve it from the EditText
if (TextUtils.isEmpty(mHint)) {
    setHint(mEditText.getHint());
    // Clear the EditText's hint as we will display it ourselves
    mEditText.setHint(null);
}

通过设置android:hint=" ",将if (TextUtils.isEmpty(mHint))计算为false,并EditText保留其提示。

2第二种选择是继承TextInputLayout并覆盖其addView(View child, int index, ViewGroup.LayoutParams params)方法:

public class CTextInputLayout extends TextInputLayout {

    public CTextInputLayout(Context context) {
        this(context, null);
    }

    public CTextInputLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        if (child instanceof EditText) {
            // cache the actual hint
            CharSequence hint = ((EditText)child).getHint();
            // remove the hint for now - we don't want TextInputLayout to see it
            ((EditText)child).setHint(null);
            // let `TextInputLayout` do its thing
            super.addView(child, index, params);
            // finally, set the hint back
            ((EditText)child).setHint(hint);
        } else {
            // Carry on adding the View...
            super.addView(child, index, params);
        }
    }
}

然后,使用您的定制CTextInoutLayout而不是设计支持库中的定制:

<your.package.name.CTextInputLayout
    ....
    .... >       <<----------

    <EditText
        ....
        ....
        android:hint="This is my cool hint"/>    <<----------

</your.package.name.CTextInputLayout>

3第三,也许最直接的方法是拨打以下电话:

// remove hint from `TextInputLayout`
((TextInputLayout)findViewById(R.id.textContainer)).setHint(null);
// set the hint back on the `EditText`
// The passed `String` could also be a string resource
((EditText)findViewById(R.id.myEditText)).setHint("This is my cool hinttt.");

4
这实际上是另一个问题的解决方案。设置app:hintEnabled =“ false”时,您会得到奇怪的错误-框的顶部或底部(带有OutlinedBox样式)被剪切甚至丢失。CTextInputLayout是此错误的完美解决方案。(我正在使用材料:1.0.0,并在材料:1.1.0 alfa 1和2上进行了测试)
Aleksandar Mironov

18

使用com.google.android.material可以隐藏

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

               ....

               app:hintAnimationEnabled="false"
               app:hintEnabled="false"
               >

                <com.google.android.material.textfield.TextInputEditText
                    ........
                    android:hint="@string/label_hint"
                    />

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

3

我已经尝试了所有答案,但现在都无法解决(特别是com.google.android.material:material:1.1.0-beta01)。即使我们在TextInputLayout中对EditText附加逻辑进行了更改,我们在字段顶部也有空白区域,该区域会遮盖一半的文本和提示。现在,我有一个解决问题的方法。最主要的是在EditText上的填充,如提及在material.io:

<com.google.android.material.textfield.TextInputLayout
             . . .
    android:layout_height="wrap_content"
    app:hintEnabled="false"
    app:startIconDrawable="@drawable/ic_search_black"
    app:endIconMode="clear_text">

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/et_search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="12dp"
        android:hint="@string/showcase_search_hint_text"
        android:inputType="text" />

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

它允许我们使用搜索图标和文本删除按钮来实现类似于“ SearchView”的视图,而无需使用自定义视图进行任何丑陋的“魔术”


1

如果您使用过app:hintEnabled =“ false”然后在EditText中也设置了android:paddingTop =“ 8dp”,并且繁荣顶部提示空间消失了,那么这对我有用,希望对您也有用


0
myEditText.setOnFocusChangeListener { _, hasFocus ->
            if (hasFocus) textContainer.hint = null
            else myEditText.hint = getString(R.string.your_string)
        }

它使您的提示在textInputLayout中完全消失了,因为如果您想通过app:hintEnabled =“ false”使它消失,那将使textInputLayout不酷:)


0
 <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/etemailLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint=" ">

            <EditText
                android:id="@+id/txtemail"
                style="@style/login_edittext"
                android:hint="Enter Your Email Address"
                android:inputType="textEmailAddress" />

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

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/etPasswordLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint=" "
            android:scrollbars="vertical"
            app:counterEnabled="true"
            app:passwordToggleEnabled="true">

            <EditText
                android:id="@+id/txtpassword"
                style="@style/login_edittext"
                android:fontFamily="@font/ubuntu"
                android:hint="Enter Password"
                android:inputType="textPassword"
                android:maxLength="8"
                android:scrollbars="vertical" />

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

将样式应用于您的EditText,将其放在Styles.xml中的下面的代码中。

<style name="login_edittext">
        <item name="android:layout_marginTop">15dp</item>
        <item name="android:background">@drawable/edittext_background</item>
        <item name="android:textColorHint">#FFFFFF</item>
        <item name="android:textColor">#FFFFFF</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
    </style>

为背景效果,在drawable中创建edittext_background.xml。

<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="rectangle"
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners android:radius="7dp" />
    <solid android:color="#80ffffff" />
    <padding android:left="10dp" android:right="10dp"
        android:top="10dp" android:bottom="10dp" />
    <stroke android:width="2dp" android:color="#FFFFFF" />
</shape>

1
这是应用提示的最简单方法,但是当用户单击EditeText时不要在上方显示它。
安基塔·巴特

必须尝试此解决方案,它在代码中不会有任何错误。无需更改代码。直接输入此代码。
安基塔·巴特

0

如果有人遇到像我这样的问题:

错误标签填充

标签使文本填充显示错误,然后执行以下操作:

<com.google.android.material.textfield.TextInputEditText
                    android:layout_width="match_parent"
                    android:paddingTop="@dimen/default_padding"
                    android:paddingBottom="@dimen/default_padding"
                    android:layout_height="wrap_content"
                    android:hint="@string/search_hint" />

将填充顶部和填充底部添加到TextInputEditText可以解决此问题


0

@Gauthier的回答是正确的,但是如果您不只是想要浮动的提示,而是想要在文本编辑之前使用提示,那么除了为TextInputLayout禁用提示之外,还应该在EditText小部件中提供提示。

我想这回答了一些人在上述评论中提出的几个问题。


-1

我认为这将帮助您:

textContainer.setHintAnimationEnabled(false);

不起作用我的朋友。我尝试通过XML进行代码编写app:hintAnimationEnabled="false",但均无济于事。我认为这只会禁用该标签浮动的动画。
Micro

因此,您要删除提示文本,是吗?
达尔沙克(Darshak)'16

我希望提示文本出现在EditText褪色的内部。然后,当您单击EditTextI时,我希望提示文本消失,而不是向上移动到浮动标签。就像常规EditText一样。
Micro

-1

更新设计库V23,并添加app:hintAnimationEnabled="false"TextInputLayout

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.