Android TextInputLayout setError 後影響 EditText 設定的自定義背景問題的 1 種解決方案
阿新 • • 發佈:2019-01-04
如圖所見的紅色背景問題,困擾了一整天,差點要放棄了,改用別的方案,終於在今日喜見雲開。。。
因為在TextInputLayout setError方法原始碼中有
// Set the EditText's background tint to the error color
mErrorShown = true;
updateEditTextBackground();
updateLabelVisibility(true);
動態新增背景也不行
動態反射改變文字顏色也有問題
真是醉了。。。
總體來說,我覺得這應該是TextInputLayout 的一個bug 也許哪天就修復了 就和setErrorEnable設定false後再設定true後 錯誤資訊不再顯示的bug差不多
還是先解決方案,再消化吧:
本來是這樣的
@Override
public void afterTextChanged(Editable editable) {
if (editable.length() > 0) {
idtt.setError("格式不正確");
} else {
idtt.setError(null);
}
}
改成現在這樣
@Override
public void afterTextChanged(Editable editable) {
if (editable.length() > 0) {
idtt2.setError("格式不正確");
/**
1.PorterDuff.Mode.CLEAR
所繪製不會提交到畫布上。
這裡的效果:無背景 無邊框
2.PorterDuff.Mode.SRC
顯示上層繪製圖片
這裡的效果:有背景 無邊框
3.PorterDuff.Mode.DST
顯示下層繪製圖片
這裡的效果:有背景 有邊框 √
4.PorterDuff.Mode.SRC_OVER
正常繪製顯示,上下層繪製疊蓋。
這裡的效果:有背景 無邊框
5.PorterDuff.Mode.DST_OVER
上下層都顯示。下層居上顯示。
這裡的效果:有背景 有邊框 √
6.PorterDuff.Mode.SRC_IN
取兩層繪製交集。顯示上層。
這裡的效果:有背景 無邊框
7.PorterDuff.Mode.DST_IN
取兩層繪製交集。顯示下層。
這裡的效果:有背景 有邊框 √
8.PorterDuff.Mode.SRC_OUT
取上層繪製非交集部分。
這裡的效果:無背景 無邊框
9.PorterDuff.Mode.DST_OUT
取下層繪製非交集部分。
這裡的效果:無背景 無邊框
10.PorterDuff.Mode.SRC_ATOP
取下層非交集部分與上層交集部分
這裡的效果:有背景 無邊框
11.PorterDuff.Mode.DST_ATOP
取上層非交集部分與下層交集部分
這裡的效果:有背景 有邊框 √
12.PorterDuff.Mode.XOR
取兩層繪製非交集。兩層繪製非交集。
這裡的效果:無背景 無邊框
13.PorterDuff.Mode.DARKEN
上下層都顯示。變暗
這裡的效果:有背景 有邊框 √
14.PorterDuff.Mode.LIGHTEN
上下層都顯示。變亮
這裡的效果:有背景 無邊框
15.PorterDuff.Mode.MULTIPLY
取兩層繪製交集
這裡的效果:有背景 有邊框 顏色變黑
16.PorterDuff.Mode.SCREEN
上下層都顯示。
這裡的效果:有背景 有邊框 顏色變白
*/
if (idtt2.getEditText().getBackground() != null) {
idtt2.getEditText().getBackground()
.setColorFilter(
//R.color.editItemLittleGray是背景顏色
ContextCompat.getColor(idtt2.getEditText().getContext(), R.color.editItemLittleGray),
//PorterDuff.Mode.DST_OVER //有錯誤提示時,邊框外也有背景
//PorterDuff.Mode.DST //通過
PorterDuff.Mode.DST_IN //通過
//PorterDuff.Mode.DST_ATOP //有錯誤提示時,邊框外也有背景
//PorterDuff.Mode.DARKEN //有錯誤提示時,邊框外也有背景
);
}
/*if(idtt2.getEditText().getBackground() != null) {
idtt2.getEditText().getBackground().mutate().setColorFilter(
//R.color.editItemLittleGray是背景顏色
ContextCompat.getColor(idtt2.getEditText().getContext(), R.color.editItemLittleGray),
//PorterDuff.Mode.DST_OVER //有錯誤提示時,邊框外也有背景
PorterDuff.Mode.DST //通過
//PorterDuff.Mode.DST_IN //通過
//PorterDuff.Mode.DST_ATOP //有錯誤提示時,邊框外也有背景
//PorterDuff.Mode.DARKEN //有錯誤提示時,邊框外也有背景
);
}*/
} else {
idtt2.setError(null);
}
}
效果就是文章開頭第三張圖片的下面一個EditText所呈現的效果