概述
一个按钮包含一个文本或者图标(或者两者都有),这些表现通常与
当用户点击它时,
要触发的事件有关。
一个按钮是文字的,图片的或者两者都有,这都取决于你想要怎样,在布局文件中创建一个按钮,有如下三种方式:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_text"
... />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/button_icon"
... />
- 含有文本和图片,使用
Button
class 类和它的android:drawableLeft
属性:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_text"
android:drawableLeft="@drawable/button_icon"
... />
响应点击事件
当用户点击一个按钮,Button 对象收到一个
on-click 事件。
为了确定一个按钮来处理这个点击事件,在xml布局文件中的
<Button>
element
元素中添加
android:onClick
属性。这个属性的值就是处理点击事件的那个函数的名称。实现这个布局的activity必须有这个函数的的实现。
例如,下面布局中的button使用了
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中,有如下函数来处理点击事件:
/** Called when the user touches the button */
public void sendMessage(View view) {
// Do something in response to button click
}
你定义的
android:onClick
属性值必须是如上所示的一个完整的签名。
另外,这个方法必须:
- 是public 的
- 返回类型为 void
- 定义一个视图作为他的唯一参数(这就是那个被点击的视图)
使用OnClickListener
你也可以直接声明一个处理程序而不用在xml文件中声明。这或许会在如下情况遇到:在运行时实例化一个按钮,在一个
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
}
})
为你的按钮使用样式
在不同设备上,你的按钮的外观(背景图片和字体)会不大相同,这是由于设备的不同制造商有不同的默认样式进行控制。
你可以通过控制在应用中使用同一个主题风格来控制外观。例如,确保所有设备都运行在安卓4.0或更高版本上,为你的app使用Holo 主题,在你的配置文件的
<application>
元素中声明
android:theme="@android:style/Theme.Holo"
。有关于在旧设备上使用Holo 主题,请阅读这篇文章 Holo Everywhere
。
给不同的背景定制不同的按钮,指定
android:background
属性字段的值是一个图像或颜色资源文件。另外,你可以为你的按钮应用一个样式,工作的方式类似于html样式,可以定义多个样式属性,例如背景,字体,字号等。更多信息请查看 Styles and Themes
.
无边界按钮(Borderless button)
一个你可能用到的无边框按钮设计风格。
Borderless buttons类似于基本的按钮,只是它没有边界和背景,但在不同的状态,例如点击时,还是可以改变外观。
创建一个无边框的按钮,为你的按钮应用
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文件中定义状态列表来表示不同状态下的不同图片或颜色。
为你的按钮背景创建一个状态列表可绘制资源文件:
- 创建三张图片分别代表按钮的默认状态,按下状态和获得焦点状态。确保你的图片适配于任何大学的按钮,使用.9png格式的位图。
- 将位图放置在工程目录下的
res/drawable/
下。确保每个位图都正确的映射了每个按钮的状态。如 button_default.9.png
,button_pressed.9.png
, 和button_focused.9.png
.
- 在
res/drawable/
下创建一个新的xml文件(像这样命名: button_custom.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>
元素就会被按次序遍历来为按钮当前状态确定一个适当的item。默认位图在最后,是因为当
android:state_pressed
和
android:state_focused
都为false是才会被应用。
这个xml文件现在代表了一个简单的可绘制资源文件,当一个按钮为他的background 引用这个文件时,显示出来的图片会基于这三种状态而改变。
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语法,包括如何定义一个禁用状态,等待状态等,请阅读 State List Drawable.