问题
I have 8 buttons in my activity. What I am looking for is, The buttons have a default background and when a button is clicked, the background color should change to some other color. This part is pretty straight forward. But, when I click on any other button, the background color of the first button should change back to default color. I understand that this will be done using "selector states", but I am not quite sure of how to implement it. The more i read about it, the more confused I am.
Right now, the xml that I have is as follows: in drawable folder
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/blue" android:state_pressed="true"/>
<item android:drawable="@color/dark_grey" android:state_focused="true"/>
<item android:drawable="@drawable/image_border"/>
</selector>
the drawable/image_border in the xml is used to define shape for the button. Below is the image_border.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="@color/dark_grey" />
<stroke
android:width="4dp"
android:color="@color/light_grey" />
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
</shape>
Can someone help me with how to change the xml to behave the way I need it to be?
[EDIT 1]
All the below answers are pointing towards similar kind of solution. Here are the changes that I did. But, still, when i press the button, it turns to the specified color but immediately turns back to the default color.
button_background_blue.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/image_border_blue" android:state_pressed="true"/>
<item android:drawable="@color/dark_grey" android:state_focused="true"/>
<item android:drawable="@drawable/image_border"/>
</selector>
image_border_blue.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="@color/blue" />
<stroke
android:width="4dp"
android:color="@color/blue" />
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
</shape>
Any thoughts?
回答1:
Create a shape named button_pressed.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/blue" />
<stroke
android:width="4dp"
android:color="@color/blue" />
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
</shape>
Suppose, you have two buttons whose IDs are R.id.btn
and R.id.btn1
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="12dp"
android:background="@drawable/button_pressed"
android:onClick="onClick"
android:text="Press Me 1" />
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="12dp"
android:background="@drawable/button_pressed"
android:onClick="onClick"
android:text="Press Me 2" />
</LinearLayout>
Write the onClick()
method which will allow you to retain the changed color until another button is pressed.
Button button;
public void onClick(View v) {
Drawable dr = getResources().getDrawable(R.drawable.button_pressed);
dr.setColorFilter(Color.parseColor("#FF0000"), PorterDuff.Mode.SRC_ATOP);
switch (v.getId()) {
case R.id.btn:
if (button == null) {
button = (Button) findViewById(v.getId());
} else {
button.setBackgroundResource(R.drawable.button_pressed);
button = (Button) findViewById(v.getId());
}
button.setBackgroundDrawable(dr);
break;
case R.id.btn2:
if (button == null) {
button = (Button) findViewById(v.getId());
} else {
button.setBackgroundResource(R.drawable.button_pressed);
button = (Button) findViewById(v.getId());
}
button.setBackgroundDrawable(dr);
break;
default:
break;
}
}
I think, now you will get What you wanted to do.
回答2:
use this selector & put it in drawable folder & set button background to this selector.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/blue" android:state_pressed="true"/>
<item android:drawable="@color/AliceBlue" android:state_focused="true"/>
<item android:drawable="@color/Azure"/>
</selector>
OR You can use Color instead of Background. hope it helps.
回答3:
I suggest you this selector.
Just create a simple selector.xml file in drawable folder and then add the selector to your button as android:background="@drawable/selector"
or by code like this: yourButton.setBackground(getResources().getDrawable(R.drawable.selector));
selector.xml
:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true"
android:state_pressed="true" android:drawable="@android:color/holo_blue_light" />
<item android:state_enabled="true"
android:state_focused="true" android:drawable="@android:color/holo_green_dark" />
<item android:state_enabled="true"
android:state_selected="true" android:drawable="@android:color/holo_purple" />
<item
android:drawable="@drawable/yourdrawable" />
</selector>
The first item is for pressed
, the second for focused
and the last is for selected
state.
回答4:
changing background color in layout when respective color button is clicked in android
main_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#b056ff"
android:id="@+id/l1">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/b1"
android:layout_gravity="center"
android:text="RED"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/b2"
android:layout_gravity="center"
android:text="GREEN" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/b3"
android:layout_gravity="center"
android:text="BLUE"/>
MyActivity.java
package ram.android.com.cwp1;
import android.app.Activity;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;
/**
* Created by VENKATESH on 10-Jun-16.
*/
public class MyActivity extends Activity implements View.OnClickListener {
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
Button r, g, b;
LinearLayout ll;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
ll = (LinearLayout) findViewById(R.id.l1);
r = (Button) findViewById(R.id.b1);
g = (Button) findViewById(R.id.b2);
b = (Button) findViewById(R.id.b3);
r.setOnClickListener(this);
g.setOnClickListener(this);
b.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.b1:
ll.setBackgroundColor(Color.RED);
break;
case R.id.b2:
ll.setBackgroundColor(Color.GREEN);
break;
case R.id.b3:
ll.setBackgroundColor(Color.BLUE);
break;
}
}
}
回答5:
I know it is very late but I hope some one would find useful. I have very simple solution, I have used in my app and works awesome.
Let me explain the logic, 1. Keep track of 2 button clicks - previous button clicked and current button clicked. I am using ArrayList 2. for every button click keep updating the previous and current button clicks value in ArrayList. 3. change the background color of previous button clicked. 4. change the background color of current button clicked.
I hope the logic is simple and straightforward.
Here is the implementation
xml
<Button
android:onClick="onClickRosterDay"
android:text="Mon"
android:textColor="@color/textColorWhite"
android:background="@color/colorAccent"
android:id="@+id/rosterMonday"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
the OnClick method is defined for every button in XML, in the example it is onClickRosterDay
Java
//buttons
Button rosterMonday;
Button rosterTuesday;
Button rosterWednesday;
Button rosterThursday;
Button rosterFriday;
Button rosterSaturday;
//ArrayList to track button clicks
private ArrayList<Button> buttonClickedDay;
in OnCreate
buttonClickedDay = new ArrayList<>();
// to start with these are the default clicks.
buttonClickedDay.add(rosterMonday ); //previous button clicked
buttonClickedDay.add(rosterMonday ); // current button clicked
public void onClickRosterDay(View v) {
switch (v.getId()){
case R.id.rosterMonday:
daySelected = "MONDAY";
// move current click button to previous button clicked position
buttonClickedDay.set(0, buttonClickedDay.get(1));
// update current clicked position
buttonClickedDay.set(1,rosterMonday);
break;
case R.id.rosterTuesday:
daySelected = "TUESDAY";
buttonClickedDay.set(0, buttonClickedDay.get(1));
buttonClickedDay.set(1,rosterTuesday);
break;
case R.id.rosterWednesday:
daySelected = "WEDNESDAY";
buttonClickedDay.set(0, buttonClickedDay.get(1));
buttonClickedDay.set(1,rosterWednesday);
break;
case R.id.rosterThursday:
daySelected = "THURSDAY";
buttonClickedDay.set(0, buttonClickedDay.get(1));
buttonClickedDay.set(1,rosterThursday);
break;
case R.id.rosterFriday:
daySelected = "FRIDAY";
buttonClickedDay.set(0, buttonClickedDay.get(1));
buttonClickedDay.set(1,rosterFriday);
break;
case R.id.rosterSaturday:
daySelected = "SATURDAY";
buttonClickedDay.set(0, buttonClickedDay.get(1));
buttonClickedDay.set(1,rosterSaturday);
break;
}
if(buttonClickedDay.get(0) != buttonClickedDay.get(1)) {
// update background color of previous button clicked
buttonClickedDay.get(0).setBackgroundColor(this.getResources().getColor(R.color.colorAccent));
// update background color of current button clicked
buttonClickedDay.get(1).setBackgroundColor(this.getResources().getColor(R.color.textBackgroundGreen));
}
}
来源:https://stackoverflow.com/questions/22044788/button-change-background-color-on-click