3

I have created a Button b with its background colour as black. When i click on it I want its colour to change to green only for the time I have my finger on it, i.e. I keep focus on it.

Diptangsu Goswami
  • 5,554
  • 3
  • 25
  • 36

4 Answers4

5

Use a selector in your button.

<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content" android:layout_width="fill_parent"
    android:gravity="center" android:focusable="true"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:background="@android:drawable/list_selector_background" />

here is code for list_selector_background XML:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/green"/> <!-- pressed -->
    <item android:state_focused="true" android:drawable="@color/blue"/> <!-- focused -->
    <item android:drawable="@color/black"/> <!-- default -->
</selector>
Lips_coder
  • 686
  • 1
  • 5
  • 17
2

You need to use onTouchListener to listen when user presses the button (ACTION_DOWN) and when the user releases it (ACTION_UP)

b.setOnTouchListener(new OnTouchListener() { 

public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_UP) {
       // reset the background color here
        b.setBackgroundColor(Color.GREEN);

    }else{ 
       // Change the background color here 
        b.setBackgroundColor(Color.RED);

    } 
    return false; 
   } 
}); 
Dave Ranjan
  • 2,966
  • 24
  • 55
  • Instead of registering touch event like this, we can make selector drawable using multiple colors/drawables for different states. – seema May 27 '16 at 09:43
0

ACTION_UP --> A pressed gesture has finished, the motion contains the final release location as well as any intermediate points since the last down or move event.

ACTION_DOWN --> A pressed gesture has started, the motion contains the initial starting location.

You should set an OnTouchListener on your button.

button.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN) {
            btn.setBackgroundColor(getResources().getColor(R.color.colorAccent));
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            btn.setBackgroundColor(getResources().getColor(R.color.white));
        }
    }
};

check motion events

Amit Vaghela
  • 22,772
  • 22
  • 86
  • 142
  • as getColor() is deprecated you can use, btn.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorAccent));@Diptangsu Goswami – Amit Vaghela May 27 '16 at 08:10
0

make this xml drawable and use as background of button.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@color/green"/> 
<item android:drawable="@color/black"/>
</selector>
seema
  • 991
  • 1
  • 13
  • 27