1. 程式人生 > >Android TextInputLayout setError 後影響 EditText 設定的自定義背景問題的 1 種解決方案

Android TextInputLayout setError 後影響 EditText 設定的自定義背景問題的 1 種解決方案

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

如圖所見的紅色背景問題,困擾了一整天,差點要放棄了,改用別的方案,終於在今日喜見雲開。。。

因為在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所呈現的效果