按钮
按钮包含文本或图标(或两者都有),当用户触碰按钮时会执行操作。
取决于你想要文本按钮,图标按钮或既有文本又有图标的按钮,你可以在布局中用以下三种方式创建按钮:
- 带文本按钮,使用
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:drawableLeft
属性的Button
类:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_text" android:drawableLeft="@drawable/button_icon" ... />
响应点击事件
当用户点击按钮时,Button
对象会接收到一个点击事件。
在XML布局中的<Button>元素中添加 android:onClick 属性就能为按钮的点击事件定义处理程序了。这个属性值必须是你要调用来响应点击事件的方法名。使用这个布局的 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
里, 使用下面的方法处理点击事件:
/** 用户触碰按钮时调用 */
public void sendMessage(View view) {
// 按钮点击时执行响应
}
在 android:onClick 属性中声明的方法名必须和上面显示的一样。具体来讲,该方法必须是:
使用OnClickListener
你也可以以编程的方式声明点击事件处理程序,而不是在XML布局文件中。如果你在运行时实例化 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) {
// 按钮点击的执行
}
});
设计按钮
按钮的外观(背景图片和字体)可能因为设备而不同,因为不同制造商生产的设备里的输入控件通常都是不同的默认样式。
可以使用适用于整个应用的主题来精确控制控件的样式。例如,要在你的应用中使用Holo主题的话,需要确保设备运行在Android 4.0或更高版本的平台上,并且在清单文件中的<application>元素里声明android:theme="@android:style/Theme.Holo"
。阅读博客 Holo Everywhere 了解更多关于在支持低版本的设备上使用Holo主题的信息。
可以通过用图片或颜色资源指定 android:background 属性来自定义不同背景的按钮。另外,你可以为按钮应用一种工作原理类似HTML的样式来定义多重属性,如背景,字体,大小等等。请查阅 Styles and Themes 了解更多关于应用样式的信息。
无边框按钮
一种有用的按钮设计是“无边框”按钮。无边框按钮除了没有边框或背景与基本按钮相同,当点击后进入不同状态时会改变外观。
为按钮应用 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文件中定义状态列表,为三种不同的按钮状态定义三种不同的图片或颜色。
为按钮背景创建状态列表图片:
- 为按钮创建三张分别代表着默认、按下和获得焦点状态的背景位图。
为了确保图片适合不同大小的按钮,以 Nine-patch 格式创建位图。
- 把位图放到工程内的
res/drawable/
目录里。确保位图的命名能够恰好反映它们代表的按钮状态,例如button_default.9.png
,button_pressed.9.png
和button_focused.9.png
. - 在
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_pressed
和android:state_focused
的值都被设置为false才会被应用。现在这个XML文件代表一个单一的图片资源,当 Button 引用它作背景时,显示的图片会基于这三种状态改变。
- 第一个
- 然后只需为按钮背景应用这个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" />
请查阅 State List Drawable 了解更多有关此XML语法的信息,包括如何定义一个不可用、悬停或其他按钮状态。