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'
我也有这个问题。
当我需要更新提示时,我(错误地)在 EditText
和 TextInputLayout
上都这样做了,这导致了模糊。
解决方案是不调用 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"
这足以隐藏默认标签。
我想在 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
的新版本更新 Graddlecompile 'com.android.support:design:22.2.1'
我也有这个问题。
当我需要更新提示时,我(错误地)在 EditText
和 TextInputLayout
上都这样做了,这导致了模糊。
解决方案是不调用 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"
这足以隐藏默认标签。