在Android(Java)中,我的应用程序中有一个动态背景色的TextView。为了使EditText“primaryColor”的背景颜色,我编写了这样的代码行:
public void setEditTextThingsColor(EditText view) {
view.getBackground().setColorFilter(colorPrimary, PorterDuff.Mode.SRC_ATOP);
(...some other settings...)
}
其中view
是我的EditText元素,primaryColor
是从数据库下载的。
我已经在API 27和API 19上对其进行了测试。它在API 27上运行良好。在API 19上它没有。
然而,当我写这样的代码时:
public void setEditTextThingsColor(EditText view) {
Drawable temp = view.getBackground();
temp.setColorFilter(colorPrimary, PorterDuff.Mode.SRC_ATOP);
view.setBackground(temp);
(...some other settings...)
}
它适用于两种API。
这种行为的原因是什么?
API 19可以找到我的元素不可变吗?
答案 0 :(得分:0)
是的setColorFilter()
方法几乎没有变化。不确定它是否是此行为的根本原因。需要进一步了解它。以下是两个版本的代码
来自KitKat
440 /**
441 * Specify a color and porterduff mode to be the colorfilter for this
442 * drawable.
443 */
444 public void setColorFilter(int color, PorterDuff.Mode mode) {
445 setColorFilter(new PorterDuffColorFilter(color, mode));
446 }
和Orio
582 /**
583 * Specify a color and Porter-Duff mode to be the color filter for this
584 * drawable.
585 * <p>
586 * Convenience for {@link #setColorFilter(ColorFilter)} which constructs a
587 * {@link PorterDuffColorFilter}.
588 * </p>
589 * <p class="note"><strong>Note:</strong> Setting a color filter disables
590 * {@link #setTintList(ColorStateList) tint}.
591 * </p>
592 */
593 public void setColorFilter(@ColorInt int color, @NonNull PorterDuff.Mode mode) {
594 if (getColorFilter() instanceof PorterDuffColorFilter) {
595 PorterDuffColorFilter existing = (PorterDuffColorFilter) getColorFilter();
596 if (existing.getColor() == color && existing.getMode() == mode) {
597 return;
598 }
599 }
600 setColorFilter(new PorterDuffColorFilter(color, mode));
601 }
而不是使用android.widget.EditText,使用android.support.v7.widget.AppCompatEditText在所有版本上制定共同行为。