Android 按钮在点击时不会改变颜色
Android Button doesn't change colour on click
当我点击一个特定的按钮时,按钮的背景颜色应该会改变,而其他按钮仍保持默认颜色。但是,在 运行 应用程序上,按钮不会更改其颜色,尽管代码中的其余逻辑工作正常。我仍然无法弄清楚出了什么问题。任何帮助将不胜感激。谢谢
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.timer_test);
adult = (Button) findViewById(R.id.btnAdult);
peer = (Button) findViewById(R.id.btnPeer);
material = (Button) findViewById(R.id.btnMaterial);
physical = (Button) findViewById(R.id.btnPhysical);
//Set button disabled, when new activity is turned on
flag.setEnabled(false);
alarm = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
...
OnClickListener codes :
if (textDemo.getText().toString() == "Record") {
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (v.equals(physical)) {
// do something
physical.setText("PHYSICAL ON CLICK WORKS");
physicalPrompt = "Yes";
physical.setBackgroundColor(getResources().getColor(R.color.buttonPressed));
adult.setBackgroundResource(R.drawable.button_selector);
peer.setBackgroundResource(R.drawable.button_selector);
material.setBackgroundResource(R.drawable.button_selector);
}
else if (v.equals(material)) {
// do something
material.setText("MATERIAL ON CLICK WORKS");
materials = "Yes";
material.setBackgroundColor(getResources().getColor(R.color.buttonPressed));
peer.setBackgroundResource(R.drawable.button_selector);
adult.setBackgroundResource(R.drawable.button_selector);
physical.setBackgroundResource(R.drawable.button_selector);
}
else if (v.equals(peer)){
peer.setText("PEER ON CLICK WORKS");
peers = "Yes";
peer.setBackgroundColor(getResources().getColor(R.color.buttonPressed));
physical.setBackgroundResource(R.drawable.button_selector);
adult.setBackgroundResource(R.drawable.button_selector);
material.setBackgroundResource(R.drawable.button_selector);
}
else if (v.equals(adult)){
adult.setText("ADULT ON CLICK WORKS");
peers = "Yes";
peer.setBackgroundColor(getResources().getColor(R.color.buttonPressed));
physical.setBackgroundResource(R.drawable.button_selector);
adult.setBackgroundResource(R.drawable.button_selector);
material.setBackgroundResource(R.drawable.button_selector);
}
else {
// do something else
textDemo.setText("Error!");
}
}
};
physical.setOnClickListener(listener);
material.setOnClickListener(listener);
peer.setOnClickListener(listener);
adult.setOnClickListener(listener);
}
}
}
在value/colors.xml,
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="buttonNotPressed">#2196F3</color>
<color name="buttonPressed">#1976D2</color>
<!--<color name="colorHighlightFAB">#B6B6B6</color>-->
<color name="ColorPrimary">#E91E63</color>
</resources>
额外代码:
public class Timer_Test extends ActionBarActivity {
//Declare widgets
Button buttonStart, flag, back, timeButton, adult, peer, material, physical;
TextView timerTextView, tvTest, interval, child, status, id, session,
passName, tvStartTime, textDemo;
按钮比仅仅改变一种颜色更复杂...
Android 按钮是使用相当多的 9 补丁和状态绘图制作的。简单地尝试设置背景颜色可能不会重置以前设置的资源样式。尝试创建另一个具有更改背景颜色的状态可绘制资源并将其分配给按钮。
先试试这个解决方案,然后告诉我它是否有效 -
private View.OnClickListener mFirstListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setBackgroundResource(R.color.red);
((Button)v).setText("New Text");
}
};
private View.OnClickListener mSecondListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setBackgroundResource(R.color.blue);
((Button)v).setText("New Text");
}
};
private View.OnClickListener mThirdListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setBackgroundResource(R.color.green);
((Button)v).setText("New Text");
}
};
private View.OnClickListener mFourthListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setBackgroundResource(R.color.light_blue);
((Button)v).setText("New Text");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = (Button) findViewById(R.id.button);
Button button2 = (Button) findViewById(R.id.button2);
Button button3 = (Button) findViewById(R.id.button3);
Button button4 = (Button) findViewById(R.id.button4);
button1.setOnClickListener(mFirstListener);
button2.setOnClickListener(mSecondListener);
button3.setOnClickListener(mThirdListener);
button4.setOnClickListener(mFourthListener);
}
推荐方式(仅使用XML)-
在名为 button_states 的可绘制文件夹中创建一个文件,并将以下代码放入 -
<?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/buttonPressed" /> <!--Pressed State-->
<item android:state_focused="true" android:drawable="@color/buttonPressed" /> <!--Focused State-->
<item android:drawable="@color/grey" /> <!--Normal State-->
</selector>
现在在你的 xml 中像这样设置按钮背景 -
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button"
android:padding="10dp"
**android:background="@drawable/button_states"**
android:layout_below="@+id/textView"
android:layout_toEndOf="@+id/textView"
android:layout_marginStart="42dp"/>
然后您根本不需要更改代码中的颜色,它会很好地工作。
如果您使用推荐的方式从所有听众中删除这一行 - v.setBackgroundResource(R.color.blue);
但是对于文本更改,您仍然需要保留以下行 ((Button)v).setText("New Text");
.
希望对您有所帮助。
我的没用,因为我设置了 exitFadeDuration
和 enterFadeDuration
:
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:exitFadeDuration="40"
android:enterFadeDuration="120">
删除后一切正常!
当我点击一个特定的按钮时,按钮的背景颜色应该会改变,而其他按钮仍保持默认颜色。但是,在 运行 应用程序上,按钮不会更改其颜色,尽管代码中的其余逻辑工作正常。我仍然无法弄清楚出了什么问题。任何帮助将不胜感激。谢谢
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.timer_test);
adult = (Button) findViewById(R.id.btnAdult);
peer = (Button) findViewById(R.id.btnPeer);
material = (Button) findViewById(R.id.btnMaterial);
physical = (Button) findViewById(R.id.btnPhysical);
//Set button disabled, when new activity is turned on
flag.setEnabled(false);
alarm = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
...
OnClickListener codes :
if (textDemo.getText().toString() == "Record") {
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (v.equals(physical)) {
// do something
physical.setText("PHYSICAL ON CLICK WORKS");
physicalPrompt = "Yes";
physical.setBackgroundColor(getResources().getColor(R.color.buttonPressed));
adult.setBackgroundResource(R.drawable.button_selector);
peer.setBackgroundResource(R.drawable.button_selector);
material.setBackgroundResource(R.drawable.button_selector);
}
else if (v.equals(material)) {
// do something
material.setText("MATERIAL ON CLICK WORKS");
materials = "Yes";
material.setBackgroundColor(getResources().getColor(R.color.buttonPressed));
peer.setBackgroundResource(R.drawable.button_selector);
adult.setBackgroundResource(R.drawable.button_selector);
physical.setBackgroundResource(R.drawable.button_selector);
}
else if (v.equals(peer)){
peer.setText("PEER ON CLICK WORKS");
peers = "Yes";
peer.setBackgroundColor(getResources().getColor(R.color.buttonPressed));
physical.setBackgroundResource(R.drawable.button_selector);
adult.setBackgroundResource(R.drawable.button_selector);
material.setBackgroundResource(R.drawable.button_selector);
}
else if (v.equals(adult)){
adult.setText("ADULT ON CLICK WORKS");
peers = "Yes";
peer.setBackgroundColor(getResources().getColor(R.color.buttonPressed));
physical.setBackgroundResource(R.drawable.button_selector);
adult.setBackgroundResource(R.drawable.button_selector);
material.setBackgroundResource(R.drawable.button_selector);
}
else {
// do something else
textDemo.setText("Error!");
}
}
};
physical.setOnClickListener(listener);
material.setOnClickListener(listener);
peer.setOnClickListener(listener);
adult.setOnClickListener(listener);
}
}
}
在value/colors.xml,
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="buttonNotPressed">#2196F3</color>
<color name="buttonPressed">#1976D2</color>
<!--<color name="colorHighlightFAB">#B6B6B6</color>-->
<color name="ColorPrimary">#E91E63</color>
</resources>
额外代码:
public class Timer_Test extends ActionBarActivity {
//Declare widgets
Button buttonStart, flag, back, timeButton, adult, peer, material, physical;
TextView timerTextView, tvTest, interval, child, status, id, session,
passName, tvStartTime, textDemo;
按钮比仅仅改变一种颜色更复杂...
Android 按钮是使用相当多的 9 补丁和状态绘图制作的。简单地尝试设置背景颜色可能不会重置以前设置的资源样式。尝试创建另一个具有更改背景颜色的状态可绘制资源并将其分配给按钮。
先试试这个解决方案,然后告诉我它是否有效 -
private View.OnClickListener mFirstListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setBackgroundResource(R.color.red);
((Button)v).setText("New Text");
}
};
private View.OnClickListener mSecondListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setBackgroundResource(R.color.blue);
((Button)v).setText("New Text");
}
};
private View.OnClickListener mThirdListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setBackgroundResource(R.color.green);
((Button)v).setText("New Text");
}
};
private View.OnClickListener mFourthListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setBackgroundResource(R.color.light_blue);
((Button)v).setText("New Text");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = (Button) findViewById(R.id.button);
Button button2 = (Button) findViewById(R.id.button2);
Button button3 = (Button) findViewById(R.id.button3);
Button button4 = (Button) findViewById(R.id.button4);
button1.setOnClickListener(mFirstListener);
button2.setOnClickListener(mSecondListener);
button3.setOnClickListener(mThirdListener);
button4.setOnClickListener(mFourthListener);
}
推荐方式(仅使用XML)-
在名为 button_states 的可绘制文件夹中创建一个文件,并将以下代码放入 -
<?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/buttonPressed" /> <!--Pressed State-->
<item android:state_focused="true" android:drawable="@color/buttonPressed" /> <!--Focused State-->
<item android:drawable="@color/grey" /> <!--Normal State-->
</selector>
现在在你的 xml 中像这样设置按钮背景 -
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button"
android:padding="10dp"
**android:background="@drawable/button_states"**
android:layout_below="@+id/textView"
android:layout_toEndOf="@+id/textView"
android:layout_marginStart="42dp"/>
然后您根本不需要更改代码中的颜色,它会很好地工作。
如果您使用推荐的方式从所有听众中删除这一行 - v.setBackgroundResource(R.color.blue);
但是对于文本更改,您仍然需要保留以下行 ((Button)v).setText("New Text");
.
希望对您有所帮助。
我的没用,因为我设置了 exitFadeDuration
和 enterFadeDuration
:
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:exitFadeDuration="40"
android:enterFadeDuration="120">
删除后一切正常!