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()));
}
});