有没有办法以编程方式自定义这些
TextInputLayout属性:
> textColorHint
> colorAccent
> colorControlNormal
> colorControlActivated
> textSelectHandle
我知道如何使用主题属性设置它们的样式,但我正在处理的项目动态加载颜色信息,据我所知,无法在运行时更改主题/样式值.
最佳答案 我写了textInputLayout实现,可以设置下划线和错误的任何颜色,并在顶部显示错误.
public class TextInputLayoutUseful extends TextInputLayout {
private CharSequence originalHint = "";
public TextInputLayoutUseful(Context context) {
super(context);
init();
}
public TextInputLayoutUseful(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public TextInputLayoutUseful(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
this.originalHint = getHint();
setErrorEnabled(false);
}
/**
* - put error text into top floating label
* - colorized layout
*
* @param error error text
*/
@Override
public void setError(@Nullable CharSequence error) {
if (error == null) {
setHint(originalHint);
setHintTextAppearance(R.style.InputLayoutNormalHint);
setUnderlineColor(R.color.input_normal_accent);
} else {
setHint(error);
setHintTextAppearance(R.style.InputLayoutErrorHint);
setUnderlineColor(R.color.input_error_accent);
}
}
/**
* colorized layout specified green color
*
* @param acceptedHint text for floating label
*/
public void setGreenError(@NonNull CharSequence acceptedHint) {
setHint(acceptedHint);
setHintTextAppearance(R.style.InputLayoutAcceptedHint);
setUnderlineColor(R.color.input_accepted_accent);
}
private void setUnderlineColor(@ColorRes int colorRes) {
if (getEditText() != null) {
getEditText().getBackground().mutate().setColorFilter(ContextCompat.getColor(getContext(), colorRes), PorterDuff.Mode.SRC_ATOP);
}
}
}
样式
<style name="InputLayoutErrorHint" parent="TextAppearance.AppCompat">
<item name="android:textColor">@color/input_error_accent</item>
</style>
<style name="InputLayoutNormalHint" parent="TextAppearance.AppCompat">
<item name="android:textColor">@color/input_normal_accent</item>
</style>
<style name="InputLayoutAcceptedHint" parent="TextAppearance.AppCompat">
<item name="android:textColor">@color/input_accepted_accent</item>
</style>