Buttons
按钮由文本或图标(或文本和图标两者)组成,用于传达用户触摸时发生的操作。
根据您是否需要带有文本,图标或两者的按钮,您可以通过三种方式在布局中创建按钮:
- 使用文本,使用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"
... />
- 使用带有文本和图标的Button类以及android:drawableLeft属性:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_text"
android:drawableLeft="@drawable/button_icon"
... />
响应Click事件
当用户单击按钮时,Button对象会收到一个单击事件。
要为按钮定义click事件处理程序,请将android:onClick属性添加到XML布局中的<Button>元素。此属性的值必须是您要响应click事件时要调用的方法的名称。然后,托管布局的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中,以下方法处理click事件:
/** 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布局声明click事件处理程序。如果在运行时实例化Button或者需要在Fragment子类中声明单击行为,则可能需要这样做。
要以编程方式声明事件处理程序,请创建一个View.OnClickListener对象,并通过调用setOnClickListener(View.OnClickListener)将其指定给该按钮。例如:
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主题的信息。
要自定义具有不同背景的单个按钮,请使用drawable或color resource指定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.png,button_pressed.9.png和button_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>元素的顺序很重要。当引用此drawable时,将按顺序遍历<item>元素以确定哪个元素适合当前按钮状态。因为默认位图是最后一个,所以只有当条件android:state_pressed和android:state_focused都被评估为false时才会应用它。
此XML文件现在表示单个可绘制资源,当Button为其背景引用时,显示的图像将根据这三种状态而更改。
4.然后只需将drawable 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语法的更多信息,包括如何定义禁用,悬停或其他按钮状态,请阅读有关State List Drawable的信息。