以编程方式更改按钮的色调

时间:2017-11-16 16:16:07

标签: java android button

我只想从java代码中更改普通按钮的backgroundTint。我尝试了许多不同的方法,如ColorStateList或setColorFilter,但没有任何效果。我有意不使用setBackgroundColor,因为我想保留按钮的原始形状。

此外,我想要使用的颜色已在我的资源中定义。经过大量的反复试验,我设法使用以下代码访问这些颜色:

int colorBtnDeactivated = ContextCompat.getColor(this, R.color.colorBtnDeactivated);

所以基本上我只需要这一行java代码,这使我能够访问背景色调。其余的我可以自己做。

我真的很感激帮助,我已经坚持了几个小时。谢谢!

编辑:使用selector-xlm不起作用,因为它只在按下时更改了按钮的颜色。按钮也会相互影响,所以按一个按钮我需要能够改变另一个按钮的背景色调。

修改2 :我再次尝试使用setColorFilter

//this is all inside the onCreate-method

int colorBtnActiveTest= ContextCompat.getColor(this, colorBtnActive);
int colorBtnDeactivatedTest=ContextCompat.getColor(this, colorBtnDeactivated);

Button btnKnockOne = (Button)findViewById(R.id.btnKnockOne);
boolean stateBtnKnockOne = false;
btnKnockOne.getBackground().setColorFilter(colorBtnDeactivatedTest, PorterDuff.Mode.SRC_IN);

btnKnockOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (stateBtnKnockOne==false){
                    btnKnockOne.getBackground().setColorFilter(colorBtnActiveTest, PorterDuff.Mode.SRC_IN);
                    stateBtnKnockOne=true;
                }

                else if (stateBtnKnockOne==true){
                    btnKnockOne.getBackground().setColorFilter(colorBtnDeactivatedTest, PorterDuff.Mode.SRC_IN);
                    stateBtnKnockOne=false;
                }
            }
        });

结果如下:

  • 当我打开活动时,该按钮以默认的灰色按钮颜色显示,而不是我的自定义颜色colorBtnDeactivatedTest
  • 当我按下按钮时,它会将其颜色短暂更改为colorBtnActiveTest,然后再返回其灰色

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案!这篇文章帮助我找到了它:https://stackoverflow.com/a/8748112/8952749

现在我基本上有两个按钮,其中一次只能选择一个按钮。为此,我创建了一个selector-xlm:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:state_selected="true"
        android:drawable="@drawable/button_active" />
    <item
        android:state_selected="false"
        android:drawable="@drawable/button_deactivated" />

</selector>

这是java代码,它允许我更改按钮的state_selected

    stateBtn1=false;
    stateBtn2=false;

    btnTest1=(Button)findViewById(R.id.button);
    btnTest2=(Button)findViewById(R.id.button2);

    btnTest1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (stateBtn1==false){
                btnTest1.setSelected(true);
                stateBtn1=true;

                btnTest2.setSelected(false);
                stateBtn2=false;
            }
            else if (stateBtn1==true){
                btnTest1.setSelected(false);
                stateBtn1=false;
            }
        }
    });

    btnTest2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (stateBtn2==false){
                btnTest2.setSelected(true);
                stateBtn2=true;

                btnTest1.setSelected(false);
                stateBtn1=false;
            }
            else if (stateBtn2==true){
                btnTest2.setSelected(false);
                stateBtn2=false;
            }
        }
    });