Android How to change Button Background on OnTouchListener
Solution 1
Using Ontouch you wont get the Clicked state of your button
use Onclick Coz , In onclick method Pressed state of button will be true
Actually I need to get button click and release
use this to get click and release
GPIO_0_B.setOnClickListener(new OnClickListener() {
@Override
public boolean onTouch(View v, MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_DOWN) {
GPIO_0_B.setBackground(R.drawable.round_button_focus);
} else if (event.getAction() == MotionEvent.ACTION_UP) {
GPIO_0_B.setBackground(R.drawable.round_button_unfocused);
}
}
};
For touch listner change this line GPIO_0_B.setOnClickListener(new OnClickListener() {
to
GPIO_0_B.setOnTouchListener(new OnTouchListener() {
how can I do with its id, Actually I have more than one button
Do this in onCreate()
:
{
Button GPIO_0_B1 =(Button) findViewById(R.id.youridfromxml);
Button GPIO_0_B1 =(Button) findViewById(R.id.youridfromxml);
GPIO_0_B1.setOnClickListener(getOnClickDoSomething(GPIO_0_B1);
GPIO_0_B2.setOnClickListener(getOnClickDoSomething(GPIO_0_B2);
}
Now
create new method (outside oncreate() method:- info for noobs)
View.OnClickListener getOnClickDoSomething(final Button Gpbot)
{
return new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if(event.getAction() == MotionEvent.ACTION_DOWN) {
Gpbot.setBackground(R.drawable.round_button_focus);
} else if (event.getAction() == MotionEvent.ACTION_UP) {
Gpbot.setBackground(R.drawable.round_button_unfocused);
}
}
}
}
Solution 2
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
v.setPressed(true);
//doYourWorkHere();
break;
case MotionEvent.ACTION_UP:
v.setPressed(false);
//doYourWorkHere();
break;
}
return true;/* true to deactivate other listeners at the same time; false otherwise */
}
Solution 3
Just setting a layout as a background to your Button in xml will do the trick. have a xml in your drawable folder named for eg:clickedstate.xml like this
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:drawable="@drawable/default_bgnd" />
<item android:state_focused="true"
android:drawable="@drawable/new_green" />
<item android:state_pressed="true"
android:drawable="@drawable/new_green" />
<item android:state_checked="true"
android:drawable="@drawable/new_green"/>
<item android:state_selected="true"
android:drawable="@drawable/new_green" />
</selector>
In your xml just do this for your button
android:background="@drawable/clickedstate"
Solution 4
You can use the below code through the onclick event listener to achieve this :
StateListDrawable states = new StateListDrawable();
Drawable image_normal = //drawable of the image
Drawable image_focused = //drawable of the image
Drawable image_pressed = //drawable of the image
states.addState(new int[] {android.R.attr.state_pressed},image_focused);
states.addState(new int[] {android.R.attr.state_focused},image_pressed);
states.addState(new int[] { },image_normal);
buttonObj.setBackgroundDrawable(states);
Haris
Updated on June 25, 2022Comments
-
Haris almost 2 years
Hi I have a button in xml, and I am using
OnTouchListener
in my activity to getbutton
press and release. But the problem is that when I press the button the background color is not changing. Where as when I extend may activity withOnClickListener
the background is changing. Can any one tell what wrong with my code.public class pushbuttonActivity extends Activity implements OnTouchListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.push_button_layout); GPIO_0_B = (Button) findViewById(R.id.GPIO_0); GPIO_0_B.setOnTouchListener((OnTouchListener) this); } public boolean onTouch(View v,MotionEvent event) { switch(v.getId()) { case R.id.GPIO_0 : GPIOPORT=0; break; default : break; } if(event.getAction() == MotionEvent.ACTION_DOWN) { //Do something on touch } else if (event.getAction() == MotionEvent.ACTION_UP) { //Do something in release } return true; }
push_button_layout.xml
<RelativeLayout ......... ................. <Button android:id="@+id/GPIO_0" android:layout_width="80dp" android:layout_height="80dp" android:background="@drawable/round_button" android:textStyle="bold" android:textSize="14sp" android:text="GPIO 0" android:layout_marginTop="15dp" android:layout_marginBottom="10dp" android:layout_marginLeft="50dp" />
round_button.xml
<?xml version="1.0" encoding="utf-8" ?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Non focused states --> <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/round_button_unfocused" /> <item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/round_button_unfocused" /> <!-- Focused states --> <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/round_button_focus" /> <item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/round_button_focus" /> <!-- Pressed --> <item android:state_pressed="true" android:drawable="@drawable/round_button_press" /> </selector>
round_button_focus.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="1dp" android:color="#FF404040" /> <corners android:radius="6dp" /> <size android:height="40dp" android:width="40dp"/> <gradient android:startColor="#FF6800" android:centerColor="#FF8000" android:endColor="#FF9700" android:angle="90" /> </shape>
round_button_press.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="2dp" android:color="#FF606060" /> <corners android:radius="40dp" /> <gradient android:startColor="#FF0000" android:centerColor="#FF0000" android:endColor="#FF0000" android:angle="90" /> </shape>
round_button_unfocus.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="2dp" android:color="#FF606060" /> <corners android:radius="40dp" /> <gradient android:startColor="#550000" android:centerColor="#550000" android:endColor="#550000" android:angle="90" /> </shape>
And sorry for the lengthy post....