我使用TextInputLayout,如果输入字段是必需的,我想以编程方式设置提示文本颜色和浮动标签颜色。在移动到TextInputLayout之前,我曾使用以下
以编程方式设置提示文本颜色 textField.setHintTextColor(Color.RED);
有人可以指导我如何以编程方式为TextInputLayout设置提示文本颜色和浮动标签颜色。
在附带的屏幕截图中,我希望提示文字地址1 在未聚焦时为红色,浮动标签地址1 的焦点应为红色。
答案 0 :(得分:14)
我用反射改变了聚焦色。这是可以帮助某人的片段。
private void setUpperHintColor(int color) {
try {
Field field = textInputLayout.getClass().getDeclaredField("mFocusedTextColor");
field.setAccessible(true);
int[][] states = new int[][]{
new int[]{}
};
int[] colors = new int[]{
color
};
ColorStateList myList = new ColorStateList(states, colors);
field.set(textInputLayout, myList);
Method method = textInputLayout.getClass().getDeclaredMethod("updateLabelState", boolean.class);
method.setAccessible(true);
method.invoke(textInputLayout, true);
} catch (Exception e) {
e.printStackTrace();
}
}
编辑2018-08-01:
如果您使用的是设计库v28.0.0及更高版本,则字段已从mDefaultTextColor
更改为defaultHintTextColor
,从mFocusedTextColor
更改为focusedTextColor
。
检查反编译类的其他字段。
答案 1 :(得分:4)
请仔细查看此处的文档:TextInputLayout Methods
有一种方法:
setHintTextAppearance(int resId)
其中包含可能是颜色资源的资源ID!
我会尝试这个,看看它是怎么回事!
我希望它可以帮到你!
答案 2 :(得分:3)
通常TextInputLayout提示文字颜色来自app的colorAccent。
但是如果你想改变那么你可以使用风格。
<android.support.design.widget.TextInputLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:theme="@style/TextLabel">
</android.support.design.widget.TextInputLayout>
@style
<style name="TextLabel" parent="TextAppearance.AppCompat">
<!-- Hint color and label color in FALSE state -->
<item name="android:textColorHint">@color/Color Name</item>
<item name="android:textSize">20sp</item>
<!-- Label color in TRUE state and bar color FALSE and TRUE State -->
<item name="colorAccent">@color/Color Name</item>
<item name="colorControlNormal">@color/Color Name</item>
<item name="colorControlActivated">@color/Color Name</item>
</style>
但是如果你想添加红色,那么如何区分错误颜色意味着基本标准错误有红色。
textField.setHintTextColor(Color.RED);有人可以指导我如何做 以编程方式设置提示文本颜色和浮动标签颜色 对于TextInputLayout。
setHintTextColor适用于API 23 +
答案 3 :(得分:3)
更改TextInput布局的Focused Color
和Default Text Color
private void setInputTextLayoutColor(int color, TextInputLayout textInputLayout) {
try {
Field field = textInputLayout.getClass().getDeclaredField("mFocusedTextColor");
field.setAccessible(true);
int[][] states = new int[][]{
new int[]{}
};
int[] colors = new int[]{
color
};
ColorStateList myList = new ColorStateList(states, colors);
field.set(textInputLayout, myList);
Field fDefaultTextColor = TextInputLayout.class.getDeclaredField("mDefaultTextColor");
fDefaultTextColor.setAccessible(true);
fDefaultTextColor.set(textInputLayout, myList);
Method method = textInputLayout.getClass().getDeclaredMethod("updateLabelState", boolean.class);
method.setAccessible(true);
method.invoke(textInputLayout, true);
} catch (Exception e) {
e.printStackTrace();
}
}
编辑:更改AppCompactEditText线条颜色
您需要将backgroundTintList
上的supportBackgroundTintList
(或EditText
)设置为ColorStateList
的实例,其中仅包含您要将色调更改为的颜色。以向后兼容的方式执行此操作的简单方法如下所示:
ColorStateList colorStateList = ColorStateList.valueOf(color)
editText.setSupportBackgroundTintList(colorStateList)
这将为EditText
提供所需的下划线颜色。
答案 4 :(得分:2)
通过Material Components library,您可以使用:
在布局中:
<com.google.android.material.textfield.TextInputLayout
app:hintTextColor="@color/mycolor"
android:textColorHint="@color/text_input_hint_selector"
.../>
样式:
<style name="..." parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
<!-- The color of the label when it is collapsed and the text field is active -->
<item name="hintTextColor">?attr/colorPrimary</item>
<!-- The color of the label in all other text field states (such as resting and disabled) -->
<item name="android:textColorHint">@color/mtrl_indicator_text_color</item>
</style>
在代码中:
// Sets the text color used by the hint in both the collapsed and expanded states
textInputLayout.setDefaultHintTextColor(...);
//Sets the collapsed hint text color
textInputLayout.setHintTextColor(....);
答案 5 :(得分:0)
让我分享我的经验。我还尝试了与此相关的每个问题中的所有解决方案。即将子窗口小部件的提示颜色更改为destroy()
我很高兴与大家分享这个问题的答案。
我们需要知道的是:-
在TextInputLayout
或其子窗口小部件的样式下面添加一行并没有太大帮助。
<项目名称=“ android:textColorHint”> @ color / white
因为它将在接收到焦点或将焦点授予可编辑小部件时使用colorAccent。
此问题的实际答案是在Application的样式标签中添加该样式行,当该样式行或任何可编辑区域不清晰时,它将通过该行设置提示颜色。 (这就是我们每次都想念的地方)。
请告知我们是否还有其他信息。
谢谢!
答案 6 :(得分:0)
我面临着同样的问题,但提示和颜色符号都变了。我通过数据绑定和Spannable
来达到这个目的。
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/ti_last_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="8dp"
app:boxStrokeWidth="0dp"
app:boxStrokeWidthFocused="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_last_name"
style="@style/EditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:onFocusChangeListener="@{viewModel.onFocusChangeListener(@string/last_name)}"
tools:hint="@string/last_name" />
</com.google.android.material.textfield.TextInputLayout>
viewModel.onFocusChangeListener
以此方式定义
fun onFocusChangeListener(hint: String) =
OnFocusChangeListener { view, isFocused ->
(view.parent.parent as TextInputLayout).apply {
val editText = (view as TextInputEditText)
if (isFocused) {
this.hintTextColor = ColorStateList.valueOf(this.getColor(R.color.black))
editText.hint = ""
this.hint = hint
} else {
if (!editText.text.isNullOrBlank()) {
this.defaultHintTextColor = ColorStateList.valueOf(this.getColor(R.color.black))
editText.hint = ""
this.hint = hint
} else {
this.hintTextColor = ColorStateList.valueOf(this.getColor(R.color.hint_color))
val builder = SpannableStringBuilder()
builder.append(hint)
val start = builder.length
val end = start + 1
builder.append("\u2981")
builder.setSpan(
ForegroundColorSpan(Color.RED),
start,
end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
builder.setSpan(
SuperscriptSpan(),
start,
end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
editText.hint = builder
this.hint = ""
}
}
}
}
允许针对聚焦状态/非聚焦状态使用不同的提示和颜色,并且具有彩色范围。
this.getColor()
只是扩展名
fun View.getColor(color: Int): Int {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
this.context.resources.getColor(color, context.theme)
} else {
this.context.resources.getColor(color)
}
答案 7 :(得分:-4)