如何在不更改已设置字体的情况下更改TextInputLayout提示的字体颜色?

时间:2019-05-09 07:13:18

标签: java android android-textinputlayout

我试图以编程方式更改 TextInputLayout 的提示颜色,尽管我已经找到了一种通过为不同的状态创建不同的样式来更改提示颜色的方法,例如:

object = mock()
object.expects(:expected_method).never
object.expected_method # => unexpected invocation

object = mock()
object.expects(:expected_method).never
# => verify succeeds

在我需要显示验证错误时设置。

但是现在这样做是在改变颜色,同时也在改变我已经设置的TypeFace。

我通过创建自定义窗口小部件来设置TypeFace:-

<style name="TextInputError" parent="Widget.Design.TextInputLayout">
        <item name="android:textColor">@color/errorRed</item>
</style>

我确实尝试在CustomTextInputLayout类中使用此方法。

public class CustomTextInputLayout extends TextInputLayout {
    private Typeface tf;

    public CustomTextInputLayout(Context context) {
        super(context);
        init(null);
    }


    private void init(AttributeSet attrs) {
        tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/gt_eesti_pro_display_regular.otf");
        if (attrs != null) {
            TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CustomTextView);
            String fontName = a.getString(R.styleable.CustomTextView_fontName);

            if (fontName != null) {
                tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/" + fontName);
            }
            a.recycle();
        }
        setTypeface(tf);
    }
}

但这仅在最初创建视图时有效。当我从活动内部设置样式时,它不仅会更改样式,还会更改字体。

setHintTextAppearance(R.style.TextInputError);

我尝试在style属性中使用fontFamily,但这没有帮助。 还有其他方法吗?

2 个答案:

答案 0 :(得分:0)

请参阅下面的给定链接 [自定义文本输入布局主题] [1] https://medium.com/fw-engineering/textinputlayout-proper-theming-dde422e86c43

答案 1 :(得分:0)

您可以使用以下方法来更改“提示颜色”而不更改TypeFace。

[1]创建以下样式

<style name="AppTheme.TextInputLayoutHintText" parent="TextAppearance.Design.Hint">
    <item name="android:textColor">@color/grayTextColor</item>
    <item name="android:textSize">@dimen/_12sp</item>
</style>


<style name="AppTheme.TextInputLayoutAppearance" parent="Widget.Design.TextInputLayout">
    <item name="hintTextAppearance">@style/AppTheme.TextInputLayoutHintText</item>
    <item name="android:textColor">@color/colorPrimaryText</item>
    <item name="android:textColorHint">@color/grayTextColor</item>
    <item name="colorControlNormal">@color/grayEditTextBackgroundTintColor</item>
    <item name="colorControlActivated">@color/grayEditTextBackgroundTintColor</item>
    <item name="colorControlHighlight">@color/grayEditTextBackgroundTintColor</item>
</style>

[2]在您的layout.xml中使用上述样式

<com.google.android.material.textfield.TextInputLayout
    android:id="@+id/textInputLayoutMobileNumber"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/_30dp"
    app:layout_constraintBottom_toTopOf="@id/buttonForgotPasscode"
    android:theme="@style/AppTheme.TextInputLayoutAppearance"
    app:layout_constraintEnd_toEndOf="@id/layoutCountryCode"
    app:layout_constraintStart_toStartOf="@id/layoutCountryCode"
    app:layout_constraintTop_toBottomOf="@id/layoutCountryCode">

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/editTextMobileNumber"
        style="@style/AppTheme.EditTextMobileNumber"
        android:imeOptions="actionDone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hint_mobile_number" />

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

请注意,我们将使用android.theme属性来设置TextInputLayout的样式

     

android:theme="@style/AppTheme.TextInputLayoutAppearance"

[3]现在在代码文件中为TextInputLayout设置TypeFace

val typeface = ResourcesCompat.getFont(context, R.font.poppins_regular)

if (typeface != null){
    textInputLayoutMobileNumber.typeface = typeface
}