versiones pie oreo developer descargar android

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 escuela setColorFilter
  • 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 .



Intente crear un EditText personalizado y agregue this.setBackgroundTintList( ColorStateList.valueOf( color ) ); en constructor.