Button根据EditText输入状态改变背景颜色

android学习 专栏收录该内容
39 篇文章 0 订阅

需求

Button随EditText输入状态改变颜色

有3个不同颜色状态,
+ EditText未输入时,Button处于不可点击状态
+ EditText输入时,Button处于高亮状态
+ EditText输入且用户按下按钮,Button –> Pressed状态

效果如下:
演示图片

EditText在没有输入时,Button不可点击,为灰色状态
EditText输入后,Button可点击,且背景变为蓝色
EditText输入后,点击Button时,Button背景色变为红色

解决思路

EditText的输入通过添加addTextChangedListener来监听
Button的点击颜色变化使用selector来控制

遇到的问题

在根据以上的实现思路实现时,遇到了一些问题

问题一:在Selector中使用android:color属性报错
button_selector.xml代码:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/holo_red_light" android:state_pressed="true"/>
    <item android:color="@android:color/darker_gray"/>
</selector>

应用崩溃的错误日志:

Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #0: <item> tag requires a 'drawable' attribute or child tag defining a drawable

日志提示在item子节点中必须要求有drawable属性,根据错误信息将所有color属性替换成了drawable,修改后的button_selector.xml如下:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/holo_red_light" android:state_pressed="true"/>
    <item android:drawable="@android:color/darker_gray"/>
</selector>

问题二:selector没有作用,Button按下时颜色并没有改变
给Button的background属性设置了button_selector
然后在EditText. addTextChangedListener中的onTextChanged方法中检测EditText的输入状态

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //EditText输入状态改变,Button背景颜色也改变
                if ("".equals(editText.getText().toString().trim())) {
                    button.setBackgroundColor(Color.GRAY);
                    button.setEnabled(false);
                } else {
                    button.setBackgroundColor(ContextCompat.getColor(context, R.color.color_blue));
                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

在EditText中输入字符后,Button背景色变为蓝色,但是pressed时却没有变成红色,背景还是蓝色,发现是button.setBackgroundColor(ContextCompat.getColor(context, R.color.color_blue));把Button的背景色给写死了,所以Button的颜色没办法改变

解决方案

整理了下问题,最后想到了一个解决方案,在布局文件中,把Button的background的属性由selector设置为不可点击颜色灰色android:background="@android:color/darker_gray",然后在onTextChanged()中,当EditText输入时,设置Button的background为selector,而不是写死颜色,这样就可以解决在EditText输入时,点击Button背景颜色却无法变化的问题!

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //EditText输入状态改变,Button背景颜色也改变
                if ("".equals(editText.getText().toString().trim())) {
                    button.setBackgroundColor(Color.GRAY);
                    button.setEnabled(false);
                } else {
                    //设置selector来控制Button背景颜色
                    button.setBackground(ContextCompat.getDrawable(context,
                            R.drawable.button_input_selector));
                    button.setEnabled(true);
                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
  • 2
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值