TextInputLayout 和 EditText 双提示问题

TextInputLayout and EditText double hint issue

我想在 EditText(位于 TextInputLayout 中)中使用 java 设置提示。

用于设置提示的代码:

aET = (EditText) findViewById(R.id.aET); aET.setHint("h?");

但即使当 edittext 获得焦点时,Hint 也会显示两次(也在 edittext 内部)。

如果有人遇到并找到解决方法,请告诉我

当 editText 获得焦点时...

当 editText 未获得焦点时..

编辑[2015 年 7 月 10 日]:

<android.support.design.widget.TextInputLayout
     android:id="@+id/aTIL"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">
     <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/aET" />
</android.support.design.widget.TextInputLayout>

首先编译依赖 编译 'com.rengwuxian.materialedittext:library:2.1.3'

将此添加到您的 xml

<com.rengwuxian.materialedittext.MaterialEditText    
android:id="@+id/etId"    
android:layout_width="match_parent"    
android:layout_height="70dip"    
android:hint="Hint goes here"    
android:textColor = "#000000"    
android:textSize="15sp"    
app:met_accentTypeface="fonts/yourcustomfonts.ttf"   
app:met_floatingLabel="normal"    
app:met_floatingLabelTextColor="#ff0000"    
app:met_floatingLabelTextSize="15sp"    
app:met_hideUnderline="true"    
app:met_textColorHint="#ff00ff"    
app:met_typeface="fonts/yourcustomfont.ttf"/>

添加xmlns:app="http://schemas.android.com/apk/res-auto"

出现此问题是因为来自 xml 的提示被传递到 TextInputLayout,因此它可以显示为浮动提示。但是当您以编程方式设置它时,提示将设置为 EditText,然后会产生两个提示(一个来自 xml,它是一个浮动提示,另一个您以编程方式设置并且是一个普通的 EditText 提示)。如果要更改浮动提示,必须在 TextInputLayout 上设置提示。

您的代码将如下所示:

aTIL = (TextInputLayout) findViewById(R.id.aTIL);
aTIL.setHint("h?");

我找到了解决方案!

在你的 EditText 添加

android:textColorHint="@android:color/transparent"

并在代码中设置来自 EditText 的提示

aET.setHint("h?");

隐藏 editText 中的提示,显示来自 TextInputLayout 的提示。

编辑:

其他方案(最佳)

用 android:design

的新版本更新 Graddle
compile 'com.android.support:design:22.2.1'

我也有这个问题。

当我需要更新提示时,我(错误地)在 EditTextTextInputLayout 上都这样做了,这导致了模糊。

解决方案是不调用 EditText.setHint() 而只调用 TextInputLayout.setHint()

简单地以编程方式使用它对我有用

    TextInputLayout til = new TextInputLayout(this);
    til.setHintTextAppearance(android.R.style.TextAppearance_Large);

您可以自定义样式,正如我在下面提到的...

<style name="TextInputLayout" parent="@android:style/TextAppearance">
        <item name="android:textColor">@color/colorPrimaryDark</item>
        <item name="android:textColorHint">@color/colorPrimaryDark</item>
        <item name="android:textSize">23sp</item>
    </style>

TextInputLayout til = new TextInputLayout(this);
        til.setHint("hai);
        til.setHintTextAppearance(R.style.TextInputLayout);

您可以使用两个提示文本。一个用于TextInputLayout,另一个用于it.Below内的编辑文本参考:

<android.support.design.widget.TextInputLayout
                                    style="@style/editText_layout"
                                    android:id="@+id/entryScreenProduction_editText_percentCompleted_layout"
                                    android:hint="%Completed">

                                    <EditText
                                        android:id="@+id/entryScreenProduction_editText_percentCompleted"
                                        style="@style/editTextNotes"
                                        android:gravity="center_vertical|top"
                                        android:inputType="numberDecimal"
                                        android:textAlignment="viewStart"
                                        android:hint="0.0"/>
</android.support.design.widget.TextInputLayout>

但这有一个问题。 UI 如下所示。提示会重叠。

为了避免上面的丑陋 UI,你必须从 program.Set EditText 的提示文本中控制它,只有当焦点在字段上时,否则删除提示文本。

android:hint="0.0"

从布局 xml 文件中删除以上行并执行以下操作:

m_editText_completed = (EditText) findViewById(R.id.entryScreenProduction_editText_percentCompleted);
m_editText_completed.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                if(b){
                    m_editText_completed.setHint("0.0");
                }
                else {
                    m_editText_completed.setHint("");
                }
            }
        });

希望这能解决您的问题。神速!!!

就我而言,我遵循 kotlin 中的这行代码

科特林代码

val edPasswordSignIn = findViewById<TextInputEditText>(R.id.edPasswordSignIn)
        edPasswordSignIn.setHint("Password")

        edPasswordSignIn.setOnFocusChangeListener { v, hasFocus ->
            if (hasFocus){
                edPasswordSignIn.setHint("Password")
            }
            else
                edPasswordSignIn.setHint("")
        }

XML代码

<!--TextInput layout which acts as a wrapper to the edit text-->
<com.google.android.material.textfield.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColorHint="#f29358"
    app:hintTextAppearance="@style/TextAppearance.AppCompat.Large"
 app:passwordToggleEnabled="true"
 app:passwordToggleTint="@color/colorPrimary"
    app:boxStrokeWidth="0dp"
    app:boxStrokeWidthFocused="0dp"

    android:scrollbarSize="25dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
    android:gravity="fill_vertical"

app:layout_constraintTop_toTopOf="parent">

<!--Using the TextInputEditText,which is
    same as the edit text,but remember-->
<!--that we need to use TextInputEditText
    with TextInputLayout-->
    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/edPasswordSignIn"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@null"
        android:backgroundTint="@color/white"
        android:gravity="center|left"
        android:inputType="textPassword"
        android:paddingTop="-2dp"
        android:paddingBottom="-1dp"

        android:textSize="@dimen/_11sdp" />
</com.google.android.material.textfield.TextInputLayout>

输入文字前

输入文字后

<com.google.android.material.textfield.TextInputLayout
                android:id="@+id/textInputLayout"
                app:hintEnabled="false"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/textField"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:hint="Hint" />

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

app:hintEnabled="false"

这足以隐藏默认标签。