2016-04-30 47 views
0

我有3个按键,所有的人都在默认情况下(subject_button安卓:检查视图的背景

我想要做的相同背景的绘制:

当我点击一个按钮,他的背景更改(到clicked_subject),所有其他人仍保留默认背景,如果点击另一个按钮后点击一个按钮,我刚刚单击的按钮将更改背景,而前一个返回到初始背景,只允许一个按钮具有clicked_subject背景,如果不同按钮被再次点击,他的背景会回到它将所有按钮都放在初始背景上。

问题:

如果我点击有多种不同的按钮,他的背景是一样的,而不是变回最初的一个。

我的逻辑:

theButton1.setBackgroundResource(R.drawable.subject_button); 
theButton1.setOnClickListener(this); 
//same for other 2 

@Override 
public void onClick(View v) { 
    if (v.getBackground() == ContextCompat.getDrawable(this, R.drawable.subject_button)) { 

     theButton1.setBackgroundResource(R.drawable.subject_button); 
     theButton2.setBackgroundResource(R.drawable.subject_button); 
     theButton3.setBackgroundResource(R.drawable.subject_button); 

     v.setBackgroundResource(R.drawable.clicked_subject); 

    } else { 

     v.setBackgroundResource(R.drawable.subject_button); 
    } 

这究竟是为什么?

回答

0

我解决它的,而不是在单击按钮只改变背景颜色,我也改变文字颜色,然后我可以检查与if (((Button) v).getCurrentTextColor() == Color.WHITE)

0

你可以这样做:

private final List<Button> mButtons = new ArrayList<>(); 

// somewhere in your code 
mButtons.add(mButton1); 
mButtons.add(mButton2); 
mButtons.add(mButton3); 
mButton1.setOnClickListener(mClickListener); 
mButton2.setOnClickListener(mClickListener); 
mButton3.setOnClickListener(mClickListener); 

private final View.OnClickListener mClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     for (Button button : mButtons) { 
      if (button == v) { 
       // set selected background 
      } else { 
       // set not selected backround 
      } 
     } 
    } 
}; 

如果你定义为你的按钮的状态绘制,那么你可以简单地改变的onclick这样:

private final View.OnClickListener mClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     for (Button button : mButtons) { 
      button.setSelected(v == button); 
     } 
    } 
}; 
+0

的文字颜色采用的是保持不变问题,这是在点击所选按钮之后,背景应该回到最初的可绘制状态 –

0

为了改变背景颜色/基于图像的在特定事件(焦点,按,正常)上,您需要定义一个按钮选择器文件并将其作为按钮的背景来实现。例如button_selector.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="@drawable/your_image1" /> <!-- pressed --> 
    <item android:state_focused="true" 
      android:drawable="@drawable/your_image2" /> <!-- focused --> 
    android:drawable="@drawable/your_image3" <!-- default --> 
</selector> 

那么就应用它为:

<Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:drawable="@drawable/button_selector.xml" /> 
0

“按下”, “选择”, “禁用”,并如View状态。因此,它们应该由Android自动处理,而不是由点击监听器处理。

这是使用SateList s,它控制看看你的意见前人的精力,这取决于状态(S)他们在有实现的。所以,你可以轻松地设置subject_button为未按状态,clicked_subject为按下状态,并让Android负责实际切换它们。

充分说明:https://developer.android.com/guide/topics/resources/drawable-resource.html#StateList

+0

如何在使用'ListState'单击另一个图像时更改图像的背景? –

+0

理想情况下,你不应该需要,因为Android应该照顾它(如果你从视图中抬起你的手指,它的状态会自动改变)。如果您的视图状态已连接,请考虑使用单选按钮:http://developer.android.com/intl/zh-cn/guide/topics/ui/controls/radiobutton.html – Vaiden