検証が赤みがかった色に失敗したときにエディットテキストの背景色を変更し、ユーザーがそれを修正し始めたら、元の色に戻したい。
EditTextは丸みを帯びた境界線を持っているため、setBackgroundColor()を使用しても、きれいな丸みを帯びた長方形ではなく醜い長方形が描画されるため、ここでは機能しません。
背景を保存して、後で復元しようとしました。そして、新しいbakgroundを使用してそれを赤く塗ります。tv.getBackground()はoriginalBgとerrorBgの両方に対して同じ参照を返すため、以下のコードは機能しません。カラーフィルターをerrorBgに設定すると、実際にはoriginalBgにも変更します。
背景オブジェクトをerrorBgに複製して、そこで色を変更するにはどうすればよいですか?
final Drawable originalBg = tv.getBackground();
final Drawable errorBg = tv.getBackground(); <-- this does not create a new Drawable, just the same reference
errorBg.setColorFilter(0xFFff6347, Mode.MULTIPLY);
tv.setBackgroundDrawable(errorBg);
tv.invalidate();
tv.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
tv.setBackgroundDrawable(originalBg);
tv.invalidate();
}
public void afterTextChanged(Editable s) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});