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

我试图在运行时以编程方式更改EditText View的着色颜色。 基本上我想改变你通常应用的东西?attr/colorControlNormal就像在默认背景drawable中一样 。

仅使用一种颜色设置new ColorsStateList ,无法正确应用更改背景色调:

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

首先,结果应用于所有EditText尽管应用了色调列表并在内部改变了drawable。 此外,默认背景1中指定的alpha在开头可见。

这是在第一个EditText上设置色调颜色的结果:

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

所以我的问题是:如何以编程方式将色调正确应用于EditText

Related of "以编程方式更改Android EditText的色调颜色"

这对我有用:

 editText.getBackground().setColorFilter(getResources().getColor(R.color.your_color), PorterDuff.Mode.SRC_ATOP); 

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

使用新引入的android.support.v4.graphics.drawable.DrawableCompat#setTint设置,现在可以使用颜色。

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

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

几个重要的注意事项:

  • 使用旧学校setColorFilter方法
  • 要使色调工作,首先将焦点切换到其他视图,然后着色EditText背景drawable

用法

 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

    

资源

 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.1上进行测试。