Android TextInputLayout以编程方式设置样式

Android TextInputLayout以编程方式设置样式,android,Android,我正在开发一款具有完全用户界面定制功能的应用程序。如果查看包装在TextInputLayout中的EditText,则EditText的默认文本提示颜色和线条颜色与样式中定义的颜色textPrimaryColor相同。但是,当EditText接收到焦点时,该行将成为样式中定义的重音的颜色,提示将通过浮动提示动画并更改为重音的颜色。使用styles.xml和themes.xml非常容易,但是,我无法通过编程实现 我设置的当前方法是: public static void setInputTextL

我正在开发一款具有完全用户界面定制功能的应用程序。如果查看包装在
TextInputLayout
中的
EditText
,则
EditText
的默认文本提示颜色和线条颜色与样式中定义的颜色
textPrimaryColor
相同。但是,当
EditText
接收到焦点时,该行将成为样式中定义的
重音的颜色,提示将通过浮动提示动画并更改为
重音的颜色。使用
styles.xml
themes.xml
非常容易,但是,我无法通过编程实现

我设置的当前方法是:

public static void setInputTextLayoutColor(final int accent, final int text, TextInputLayout textInputLayout, AppCompatEditText edit) {
    edit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            AppCompatEditText editText = (AppCompatEditText) v;
            editText.getBackground().clearColorFilter();
            if(hasFocus) editText.getBackground().setColorFilter(accent, PorterDuff.Mode.SRC_IN);
            else editText.getBackground().setColorFilter(text, PorterDuff.Mode.SRC_IN);
        }
    });


    setCursorColor(edit, accent);

    try {
        Field field = textInputLayout.getClass().getDeclaredField("mFocusedTextColor");
        field.setAccessible(true);
        int[][] states = new int[][]{
                new int[]{}
        };
        int[] colors = new int[]{
                accent
        };
        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();
    }
}
此方法的问题是A)提示文本立即着色为强调色,当收到焦点时,它不会着色为强调色B)
EditText
行以正确的颜色开始,但当它收到焦点时,它会着色为样式中定义的
强调色,而不是编程设置的颜色

这是非聚焦图片(参考“事件名称”字段)。此处,“事件名称”的颜色应为灰色/白色(如文本):


这是聚焦的图片,在这里,除了线条的颜色(也应该是绿色)之外,一切都正常。

无法计算动态更改提示颜色,但我让听众更改线条颜色:

    AppCompatEditText edit = (AppCompatEditText)findViewById(R.id.event_create_name_edit);
    edit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            AppCompatEditText edit2 = (AppCompatEditText)v;
            if(hasFocus) edit2.setSupportBackgroundTintList(ColorStateList.valueOf(rui.getAccent()));
            else edit2.setSupportBackgroundTintList(ColorStateList.valueOf(rui.getText()));
        }
    });