EditText奇怪的行为

时间:2018-06-08 07:14:02

标签: java android android-edittext

在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可以找到我的元素不可变吗?

1 个答案:

答案 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在所有版本上制定共同行为。