oreo - android pie
Cambiando el color del tinte de Android EditText programáticamente (4)
Con la nueva configuración de android.support.v4.graphics.drawable.DrawableCompat#setTint
, ahora es posible establecer el color.
Estoy tratando de cambiar el color del tinte de una Vista de EditText
de EditText
programáticamente durante el tiempo de ejecución. Básicamente, quiero cambiar lo que normalmente se aplicaría como ?attr/colorControlNormal
como en el dibujo de fondo predeterminado .
Cambiar el tinte de fondo no se aplica correctamente simplemente configurando una new ColorsStateList
con un solo color:
editText.setBackgroundTintList( ColorStateList.valueOf( color ) );
Por un lado, el resultado se aplica a todo EditText
aunque la lista de tinte se aplica y muta internamente el dibujo. También el alfa como se especifica en el fondo por defecto 1 es visible al principio.
Aquí está el resultado de configurar el color del tinte solo en el primer texto de EditText
:
Así que mi pregunta sería: ¿Cómo puedo aplicar correctamente el tinte mediante programación a un EditText
?
Escribí un pequeño componente para lograr este comportamiento.
Algunas notas importantes:
- Se utiliza el método
setColorFilter
vieja escuelasetColorFilter
- Para hacer que el tinte funcione, primero cambie el enfoque a otra vista, luego tinte el texto del texto del texto que se puede
EditText
Uso
ErrorLabelLayout layoutPassError = (ErrorLabelLayout) findViewById(R.id.layoutPasswordError)
layoutPassError.setError("Password_is_wrong");
// when you want to clear error e.g. in on text changed method
layoutPassError.clearError();
XML
<com.view.material.ErrorLabelLayout
android:id="@+id/layoutPasswordError"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="false">
<EditText
android:id="@+id/editPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="Enter your password"/>
</com.view.material.ErrorLabelLayout>
Fuente
public class ErrorLabelLayout extends LinearLayout implements ViewGroup.OnHierarchyChangeListener {
private static final int ERROR_LABEL_TEXT_SIZE = 12;
private static final int ERROR_LABEL_PADDING = 4;
private TextView mErrorLabel;
private Drawable mDrawable;
private int mErrorColor;
public ErrorLabelLayout(Context context) {
super(context);
initView();
}
public ErrorLabelLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public ErrorLabelLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView() {
setOnHierarchyChangeListener(this);
setOrientation(VERTICAL);
mErrorColor = Color.parseColor("#D32F2F");
initErrorLabel();
}
private void initErrorLabel() {
mErrorLabel = new TextView(getContext());
mErrorLabel.setFocusable(true);
mErrorLabel.setFocusableInTouchMode(true);
mErrorLabel.setTextSize(ERROR_LABEL_TEXT_SIZE);
mErrorLabel.setTextColor(mErrorColor);
mErrorLabel.setPadding(dipsToPix(ERROR_LABEL_PADDING), 0, dipsToPix(ERROR_LABEL_PADDING), 0);
}
public void setErrorColor(int color) {
mErrorColor = color;
mErrorLabel.setTextColor(mErrorColor);
}
public void clearError() {
mErrorLabel.setVisibility(INVISIBLE);
mDrawable.clearColorFilter();
}
public void setError(String text) {
mErrorLabel.setVisibility(VISIBLE);
mErrorLabel.setText(text);
// changing focus from EditText to error label, necessary for Android L only
// EditText background Drawable is not tinted, until EditText remains focus
mErrorLabel.requestFocus();
// tint drawable
mDrawable.setColorFilter(mErrorColor, PorterDuff.Mode.SRC_ATOP);
}
@Override
public void onChildViewAdded(View parent, View child) {
int childCount = getChildCount();
if (childCount == 1) {
mDrawable = getChildAt(0).getBackground();
addView(mErrorLabel);
}
}
@Override
public void onChildViewRemoved(View parent, View child) {
}
private int dipsToPix(float dps) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
dps, getResources().getDisplayMetrics());
}
}
Probado en API com.android.support:appcompat-v7:22.1.1
con la biblioteca com.android.support:appcompat-v7:22.1.1
.
Esto funciona para mí:
editText.getBackground().setColorFilter(getResources().getColor(R.color.your_color),
PorterDuff.Mode.SRC_ATOP);
Fuente: Cambiar el color de la línea inferior de EditText con appcompat v7
Intente crear un EditText
personalizado y agregue this.setBackgroundTintList( ColorStateList.valueOf( color ) );
en constructor.