按钮

按钮包含文本和/或图标,可表明当用户触摸它时会引发哪种操作。

您可以通过三种方式在布局中创建按钮,具体取决于按钮是仅包含文本、仅包含图标还是同时包含文本和图标:

  • 要仅包含文本,请使用 Button 类:
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_text"
        ... />
    
  • 要仅包含图标,请使用 ImageButton 类:
    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/button_icon"
        android:contentDescription="@string/button_icon_desc"
        ... />
    
  • 要同时包含文本和图标,请使用具有 android:drawableLeft 属性的 Button 类:
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_text"
        android:drawableLeft="@drawable/button_icon"
        ... />
    

关键类如下:

响应点击事件

当用户点击按钮时,Button 对象会收到点击事件。

要为按钮定义点击事件处理脚本,请将 android:onClick 属性添加到 XML 布局中的 <Button> 元素。此属性的值必须是为了响应点击事件而调用的方法的名称。随后,托管布局的 Activity 必须实现相应的方法。

例如,下面的布局包含使用 android:onClick 的按钮:

<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/button_send"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />

在托管此布局的 Activity 内,以下方法可处理点击事件:

Kotlin

/** Called when the user touches the button */
fun sendMessage(view: View) {
    // Do something in response to button click
}

Java

/** Called when the user touches the button */
public void sendMessage(View view) {
    // Do something in response to button click
}

您在 android:onClick 属性中声明的方法必须具有完全如上所示的签名。具体而言,该方法必须满足以下条件:

  • 公开
  • 返回 void
  • View 指定为其唯一的参数(这将是被点击的 View

使用 OnClickListener

您也可以通过程序化方式(而不是在 XML 布局中)声明点击事件处理脚本。如果您在运行时实例化 Button,或者需要在 Fragment 子类中声明点击行为,则可能必须要这样做。

要以程序化方式声明事件处理脚本,请调用 setOnClickListener(View.OnClickListener),以便创建一个 View.OnClickListener 对象,并将其分配给按钮。例如:

Kotlin

val button: Button = findViewById(R.id.button_send)
button.setOnClickListener {
    // Do something in response to button click
}

Java

Button button = (Button) findViewById(R.id.button_send);
button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // Do something in response to button click
    }
});

设置按钮样式

按钮的外观(背景图片和字体)可能会因设备而异,因为制造商不同,设备为输入控件采用的默认样式通常也会不同。

您可以使用应用于整个应用的主题来精确控制控件的样式。例如,要确保所有搭载 Android 4.0 及更高版本的设备都在您的应用中使用 Holo 主题,请在清单的 <application> 元素中声明 android:theme="@android:style/Theme.Holo"。另请参阅博文 Holo Everywhere,了解如何在支持更低版本设备的同时使用 Holo 主题。

要使用不同背景自定义各个按钮,请使用可绘制资源或颜色资源指定 android:background 属性。 或者,您可以为按钮应用样式,这样会按照与 HTML 样式类似的方式定义多个样式属性,例如背景、字体和尺寸等。如需详细了解如何应用样式,请参阅样式和主题

无边框按钮

“无边框”按钮可能会是一种非常有用的设计。无边框按钮类似于基本按钮,唯一的区别是前者没有边框或背景,但其外观仍会因状态(如点击后)而改变。

如需创建无边框按钮,请对按钮应用 borderlessButtonStyle 样式。例如:

<Button
    android:id="@+id/button_send"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage"
    style="?android:attr/borderlessButtonStyle" />

自定义背景

如果要真正重新定义按钮的外观,可以指定自定义背景。不过,您的背景应该是根据按钮的当前状态来更改外观的状态列表资源,而不是提供简单的位图或颜色。

您可以在 XML 文件中定义状态列表,并在其中定义三种不同的图片或颜色,供不同的按钮状态使用。

如需为按钮背景创建状态列表可绘制资源,请执行以下操作:

  1. 为按钮背景创建三个位图,分别表示以下按钮状态:默认、按下和聚焦。

    为确保您提供的图片适合各种尺寸的按钮,请以九宫格位图形式创建位图。

  2. 将位图放入项目的 res/drawable/ 目录中。请确保每个位图都具有适当的名称,以反映它们各自表示的按钮状态,例如 button_default.9.pngbutton_pressed.9.pngbutton_focused.9.png
  3. res/drawable/ 目录中创建一个新的 XML 文件(将其命名为类似 button_custom.xml 的名称)。插入以下 XML:
    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/button_pressed"
              android:state_pressed="true" />
        <item android:drawable="@drawable/button_focused"
              android:state_focused="true" />
        <item android:drawable="@drawable/button_default" />
    </selector>
    

    这样可以定义单个可绘制资源,该资源将根据按钮的当前状态更改其图片。

    • 第一个 <item> 定义按下(激活)按钮后使用的位图。
    • 第二个 <item> 定义按钮处于聚焦状态时(使用轨迹球或方向键突出显示按钮时)使用的位图。
    • 第三个 <item> 定义按钮处于默认状态时(既未按下,也未聚焦时)使用的位图。

    注意<item> 元素的顺序很重要。引用这个可绘制资源时,系统将按顺序遍历 <item> 元素,以确定哪个元素适合当前的按钮状态。由于默认位图位于最后,因此仅当条件 android:state_pressedandroid:state_focused 均判定为 false 时,才会应用该位图。

    此 XML 文件现在表示单个可绘制资源,当 Button 引用此文件作为背景时,显示的图片将根据这三种状态而变化。

  4. 然后,只需将可绘制的 XML 文件应用为按钮背景即可:
    <Button
        android:id="@+id/button_send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_send"
        android:onClick="sendMessage"
        android:background="@drawable/button_custom"  />
    

如需详细了解此 XML 语法,包括如何定义停用、悬停或其他按钮状态,请参阅状态列表可绘制资源