我在Android 5中遇到了一个非常奇怪的问题。如果用户输入错误我想将错误设置为edittext并将其颜色更改为红色,当用户开始输入内容时我想将颜色更改回绿色。我就是这样做的:
eText.setError(message);
eText.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP);
eText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
eText.getBackground().setColorFilter(
ctx.getResources().getColor(R.color.dark_green), PorterDuff.Mode.SRC_ATOP);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {}
@Override
public void afterTextChanged(Editable s) {}
});
在低于5的Android版本中,一切都很完美,但不是在Lollipop中。如果我更改了一个edittext颜色,则所有应用中的所有edittexts都会更改颜色。有没有办法解决这个奇怪的事情?或者它是一些材料设计和Android 5技巧,我不知道?
问题是背景Drawable
在许多视图中被重用。为了确保多个视图之间不共享Drawable
,您应该使用mutate
方法。
见:mutate()
示例代码:
Drawable background = mainMenuButton.getBackground();
background.mutate();
background.setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.light_green), PorterDuff.Mode.MULTIPLY));
mainMenuButton.setBackground(background);
Android 5.0 Lollipop: setColorFilter "leaks" onto other buttons
对于类似微调器的颜色变化也一样。
在Android Lollipop版本中,您必须分别为kitkat版本和棒棒糖版本实现代码,请执行此代码以更改微调器的背景。它的图像背景变化的例子。
if (Build.VERSION.SDK_INT => Build.VERSION_CODES.KitKat)
{
//for Lollipop Vession
// do on textChangeListner code
eText.setBackgroundDrawable(Color.RED);
}
else
{
// do on textChangeListner code
eText.setBackgroundResource(Color.RED);
}
我希望它可以帮助你,如果它是有用的代码然后请标记我.. Thanx .. :)