Android 如何在XML文件中设置选中/未选中按钮的背景

Android 如何在XML文件中设置选中/未选中按钮的背景,android,xml,button,Android,Xml,Button,我有一些自定义按钮,它们应该有不同的背景,这取决于它们是否被选中。我想知道是否有办法在XML文件中声明这一点。我有一个摄氏度按钮和一个华氏度按钮。我希望它能工作,如果选择了一个,它会保持“按下”状态,无法点击,而另一个按钮可以按下 <Button android:id="@+id/celsiusButton" android:text="C" android:background="@drawable/

我有一些自定义按钮,它们应该有不同的背景,这取决于它们是否被选中。我想知道是否有办法在XML文件中声明这一点。我有一个摄氏度按钮和一个华氏度按钮。我希望它能工作,如果选择了一个,它会保持“按下”状态,无法点击,而另一个按钮可以按下

        <Button
            android:id="@+id/celsiusButton"
            android:text="C"
            android:background="@drawable/button_unpressed_shape"
            android:layout_weight="3"
            android:layout_height="match_parent"
            android:layout_width="0dip"
            android:gravity="center" />

        <Button
            android:id="@+id/fahrenheitButton"
            android:text="F"
            android:background="@drawable/button_unpressed_shape"
            android:layout_weight="3"
            android:layout_height="match_parent"
            android:layout_width="0dip"
            android:gravity="center" />

如果选择或未选择,则应使用切换按钮

请注意,仍有4个州可供选择

您可以在这样的选择器中定义它们

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:state_pressed="true" android:drawable="@drawable/likeactivepressed" />
    <item android:state_pressed="true" android:drawable="@drawable/likeinitialpressed"/>
    <item android:state_checked="true" android:drawable="@drawable/likeon"/>
    <item android:drawable="@drawable/likeinitial"/>
</selector>
  android:background="@drawable/like_button"
编辑

实际上,你可以只使用一个按钮。或者,您可以使用2个单选按钮


是,您可以根据渲染视图的状态选择一个可绘制的
视图

这正是
选择器的作用。请参见此处的示例和指南:

基本上,选择器的每个
项定义了哪些状态具有哪些值。它还定义了表示这组值的drawable

接下来,您可以从代码中设置
视图的状态,例如

celsiusButton.setPressed(true);
这在实践中非常有用,因为您将UI设置与模型/控制器分离。如果代码不负责以直接方式更改应用程序的UI,那么维护大型绘图集就更容易了

我的工作选择器的一个示例是:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/ic_background_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/ic_background_focused" android:state_focused="true"/>
    <item android:drawable="@drawable/ic_background_default" />

</selector>


此示例根据按钮的状态呈现按钮背景。

这用于更改按钮在按下或聚焦时的颜色 在您的drawable文件夹中编写此代码

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Button Focused-->
    <item   android:state_focused="true"
            android:state_pressed="false"
            android:drawable="@drawable/login_hover"
            />
<!-- Button Focused Pressed-->
    <item   android:state_focused="true"
            android:state_pressed="true"
            android:drawable="@drawable/login_hover"
            />
<!-- Button Pressed-->
    <item   android:state_focused="false"
            android:state_pressed="true"
            android:drawable="@drawable/login_hover"
            />
<!-- Button Default Image-->
    <item   android:drawable="@drawable/login_bg"/>

</selector


要更改背景图像,请执行以下操作:

public void onClick(View v) {
   if(v == ButtonName) {
     ButtonName.setImageResource(R.drawable.ImageName);
   }
}
或者,使用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/login_selected" /> <!-- pressed -->
  <item android:state_focused="true"
   android:drawable="@drawable/login_mouse_over" /> <!-- focused -->
  <item android:drawable="@drawable/login" /> <!-- default -->
</selector>

谢谢,看起来真的很不错。要想让它工作,你必须按你的按钮。设置FocusableInTouchMode(true)
<?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/login_selected" /> <!-- pressed -->
  <item android:state_focused="true"
   android:drawable="@drawable/login_mouse_over" /> <!-- focused -->
  <item android:drawable="@drawable/login" /> <!-- default -->
</selector>
ButtonName.setBackgroundDrawable(getResources().getDrawable(R.drawable.ImageName));