以编程方式更改Android EditText的着色颜色

我正在尝试在运行时以编程方式更改EditText视图的着色颜色。 基本上我想改变你通常会应用?attr/colorControlNormal像在默认的背景绘制 。

更改背景色调通过只设置一种颜色的new ColorsStateList无法正确应用:

editText.setBackgroundTintList( ColorStateList.valueOf( color ) );

对于一个结果应用于所有的EditText尽pipe应用了色调列表,并在内部改变了可绘制的。 此外,在默认背景1中指定的alpha在开始处是可见的。

以下是在第一个EditText上设置色调的结果:

在第一个EditText上设置色调的结果

所以我的问题是:我如何正确地应用色彩以编程方式到EditText

Solutions Collecting From Web of "以编程方式更改Android EditText的着色颜色"

这个工作对我来说editText.getBackground().setColorFilter(getResources().getColor(R.color.your_color), PorterDuff.Mode.SRC_ATOP);

来源使用appcompat v7更改EditText底线颜色

尝试创build一个自定义EditText并添加this.setBackgroundTintList( ColorStateList.valueOf( color ) ); 进入构造函数。

随着新引入的android.support.v4.graphics.drawable.DrawableCompat#setTint设置颜色现在是可能的。

我写了一个小组件来实现这个行为。

几个重要的注意事项:

  • 使用老派的setColorFilter方法
  • 要使色调工作,首先将焦点切换到其他视图,然后调整EditText背景可绘制

用法

 ErrorLabelLayout layoutPassError = (ErrorLabelLayout) findViewById(R.id.layoutPasswordError) layoutPassError.setError("Password_is_wrong"); // when you want to clear error eg 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> 

资源

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

使用com.android.support:appcompat-v7:22.1.1库对API com.android.support:appcompat-v7:22.1.1testing。