Android 按钮小部件
最后修改日期:2012 年 10 月 28 日
在本章 Android 开发教程中,我们将介绍按钮小部件。
Button
类代表 Android 中的一个按钮小部件。按钮类的完整包路径为 android.widgets.Button
。按钮通过点击来执行操作。按钮可以显示文本、图标,或两者都显示。按钮点击事件的事件处理程序通过 <Button>
元素的 android:onClick
属性定义,或者通过以编程方式设置 setOnClickListener(View.OnClickListener)
来定义。
按钮
在第一个示例中,我们定义了一个按钮,按下时会关闭一个活动。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zetcode.finish" android:versionCode="1" android:versionName="1.0"> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"> <activity android:name="MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
这是程序的清单文件。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_marginTop="10dip" android:text="@string/btnlabel" android:onClick="onClick" /> </LinearLayout>
在 main.xml
布局文件中,我们使用 <Button> 元素定义了一个按钮小部件。前两个属性定义了按钮的大小,使其足够大以显示其内容。android:layout_marginTop="10dip"
在屏幕标题栏和按钮小部件之间创建了一个边距。dip(密度无关像素)是用于 Android 布局管理器的度量单位。它最能反映各种 Android 设备的丰富分辨率和密度。android:text="@string/btnlabel"
属性为按钮定义了文本。实际文本位于 strings.xml
文件中,我们很快就会介绍它。最后,android:onClick="onClick"
属性为点击事件创建了一个按钮事件监听器。我们只需在相关的 Java 源文件中定义 onClick() 方法。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Finish button</string> <string name="btnlabel">Finish</string> </resources>
在 strings.xml
文件中,我们有两个资源字符串。第一个用于清单文件,为应用程序和主活动提供名称。第二个用于布局文件,为按钮小部件提供文本标签。
package com.zetcode.finish; import android.app.Activity; import android.view.View; import android.os.Bundle; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void onClick(View view) { finish(); } }
这是主活动的源文件。我们定义了一个 onClick()
方法,它响应按钮点击事件。它必须将 View
作为其唯一参数。该方法调用 finish()
方法,该方法会关闭当前活动。我们将被重定向回应用程序列表。

点击按钮,我们将被重定向回应用程序列表。
显示 Toast
Toast 是一种包含用户快速消息的视图。Toast 可以显示很短或很长的时间。在我们的第二个应用程序中,我们创建了一个按钮小部件。按下后,它将显示一个 Toast 消息。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zetcode.toast" android:versionCode="1" android:versionName="1.0"> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"> <activity android:name="MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
这是清单文件。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/btnId" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:text="@string/label" /> </LinearLayout>
在 main.xml
布局文件中,我们在 LinearLayout 中有一个按钮小部件,它将小部件排列在单行或单列中。在我们的例子中,按钮在单列中。按钮具有 android:id="@+id/btnId"
属性。该属性为按钮提供了一个标识符名称。我们将在主活动中使用 findViewById()
方法检索按钮。不需要引用的小部件不需要此属性。加号用于创建元素的 ID。在 XML 文件中对元素的后续引用将不带加号。(例如在布局管理器中)。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Show Toast</string> <string name="label">Show</string> </resources>
这是 strings.xml
资源文件。按钮将具有“Show”文本标签。
package com.zetcode.toast; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Gravity; import android.widget.Button; import android.widget.Toast; import android.content.Context; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initUI(); } public void initUI() { Button btn = (Button) findViewById(R.id.btnId); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Context ctx = getApplicationContext(); String msg = "Button was clicked"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(ctx, msg, duration); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } }); } }
当我们点击按钮小部件时,它会在屏幕中央显示一个 Toast 消息。Toast 将显示很短一段时间。
... import android.view.View.OnClickListener; import android.view.Gravity; import android.widget.Button; import android.widget.Toast; import android.content.Context;
这些是此示例中需要导入的一些新类。
initUI();
在 onCreate()
方法中,我们调用 initUI() 方法。它将 OnClickListener()
添加到按钮小部件。
Button btn = (Button) findViewById(R.id.btnId);
我们获取在 main.xml
文件中指定按钮小部件的引用。我们使用 findViewById()
方法。该方法通过 main.xml
文件中的 id 属性查找 View
(按钮是一种 View)。id 位于自动生成的 R 类中。R 代表 Resource。我们可以在 gen/com/zetcode/toast/R.java
源文件中查看 R 的源代码。在那里,我们将找到按钮 id 以及其他 ID。
btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { ... } });
我们将 OnClickListener
添加到按钮小部件。监听器可以通过多种方式设置。这里我们使用了一个匿名内部类。
Context ctx = getApplicationContext(); String msg = "Button was clicked"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(ctx, msg, duration); toast.setGravity(Gravity.CENTER, 0, 0); toast.show();
我们设置并显示 Toast
视图。我们获取应用程序上下文,创建消息和持续时间。gravity 是视图在其父视图中的对齐方式。我们将 Toast 定位在屏幕中央。默认情况下,Toast 显示在屏幕底部。

复选框
CheckBox
小部件是一种特殊的按钮。它有两种状态:开和关。开状态由矩形内的勾号表示。
java.lang.Object android.view.View android.widget.TextView android.widget.Button android.widget.CompoundButton android.widget.CheckBox
这是 CheckBox
小部件的继承层次结构。Button
小部件是其父代之一。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zetcode.checkbox" android:versionCode="1" android:versionName="1.0"> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"> <activity android:name="MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
清单文件。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <CheckBox android:id="@+id/cb_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/cblabel" /> </LinearLayout>
<CheckBox> 元素创建一个 CheckBox
小部件。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">CheckBox</string> <string name="cblabel">Show title</string> </resources>
字符串资源。
package com.zetcode.checkbox; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.CheckBox; public class MainActivity extends Activity { private CheckBox cb; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initUI(); } public void initUI() { cb = (CheckBox) findViewById(R.id.cb_id); cb.setChecked(true); cb.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CheckBox cb = (CheckBox) v; if (cb.isChecked()) { setTitle("CheckBox"); } else { setTitle(""); } } }); } }
CheckBox
切换屏幕标题的可见性。当 CheckBox
处于选中状态时,标题可见。否则不可见。
import android.widget.CheckBox;
我们将 CheckBox
类导入到源文件中。
cb = (CheckBox) findViewById(R.id.cb_id);
我们找到在 main.xml
文件中定义的 CheckBox
小部件的引用。
cb.setChecked(true);
标题默认可见,因此 CheckBox
必须处于选中状态。我们使用 setChecked()
方法更改小部件的状态。
cb.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CheckBox cb = (CheckBox) v; if (cb.isChecked()) { setTitle("CheckBox"); } else { setTitle(""); } } });
在 OnClickListener()
中,我们定义了 onClick()
方法。我们使用 isChecked()
方法确定小部件的状态。屏幕标题通过 setTitle()
方法修改。

在本章 Android 开发教程中,我们介绍了按钮小部件。