我正在尝试在运行时以编程方式更改EditText
View的着色颜色。基本上我想改变?attr/colorControlNormal
中new ColorsStateList
通常适用的内容。
只需使用一种颜色设置editText.setBackgroundTintList( ColorStateList.valueOf( color ) );
即可正确应用更改背景色调:
EditText
一个结果应用于所有EditText
,尽管应用了色调列表并在内部改变了drawable。此外,默认背景default background drawable中指定的alpha在开头可见。
以下是仅在第一个EditText
上设置色调颜色的结果:
所以我的问题是:如何以编程方式将色调正确应用于{{1}}?
答案 0 :(得分:36)
这对我有用:
editText.getBackground().setColorFilter(getResources().getColor(R.color.your_color),
PorterDuff.Mode.SRC_ATOP);
答案 1 :(得分:18)
使用新引入的android.support.v4.graphics.drawable.DrawableCompat#setTint
设置,现在可以使用颜色。
答案 2 :(得分:9)
尝试创建自定义EditText
并将this.setBackgroundTintList( ColorStateList.valueOf( color ) );
添加到构造函数中。
答案 3 :(得分:0)
我写了一个小组件来实现这种行为。
很少有重要说明:
setColorFilter
方法EditText
background drawable 用法
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>
来源
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 16/21上进行测试。
答案 4 :(得分:0)
$("#accordion").accordion({ collapsible: true, active: false });
对我不起作用。我用过:
setColorFilter
或
Drawable wrappedDrawable = DrawableCompat.wrap(mView.getBackground());
DrawableCompat.setTint(wrappedDrawable, getResources().getColor(R.color.red));
mView.setBackgroundDrawable(wrappedDrawable);
尝试一下。
答案 5 :(得分:0)
对于 Kotlin
editText.backgroundTintList = ColorStateList.valueOf(R.color.colorLightGray )