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所呈现的效果

ps:另外hint和EditText上下的距离解决方法可以看看这个:
http://blog.csdn.net/richiezhu/article/details/52621170

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值