ZetCode

Android 按钮小部件

最后修改日期:2012 年 10 月 28 日

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

Button 类代表 Android 中的一个按钮小部件。按钮类的完整包路径为 android.widgets.Button。按钮通过点击来执行操作。按钮可以显示文本、图标,或两者都显示。按钮点击事件的事件处理程序通过 <Button> 元素的 android:onClick 属性定义,或者通过以编程方式设置 setOnClickListener(View.OnClickListener) 来定义。

按钮

在第一个示例中,我们定义了一个按钮,按下时会关闭一个活动。

AndroidManifest.xml
<?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>

这是程序的清单文件。

main.xml
<?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() 方法。

strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Finish button</string>
    <string name="btnlabel">Finish</string>
</resources>

strings.xml 文件中,我们有两个资源字符串。第一个用于清单文件,为应用程序和主活动提供名称。第二个用于布局文件,为按钮小部件提供文本标签。

MainActivity.java
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() 方法,该方法会关闭当前活动。我们将被重定向回应用程序列表。

Button
图示:按钮

点击按钮,我们将被重定向回应用程序列表。

显示 Toast

Toast 是一种包含用户快速消息的视图。Toast 可以显示很短或很长的时间。在我们的第二个应用程序中,我们创建了一个按钮小部件。按下后,它将显示一个 Toast 消息。

AndroidManifest.xml
<?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>

这是清单文件。

main.xml
<?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 文件中对元素的后续引用将不带加号。(例如在布局管理器中)。

strings.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”文本标签。

MainActivity.java
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 显示在屏幕底部。

Showing toast
图示:显示 Toast

复选框

CheckBox 小部件是一种特殊的按钮。它有两种状态:开和关。开状态由矩形内的勾号表示。

java.lang.Object
  android.view.View
     android.widget.TextView
       android.widget.Button
         android.widget.CompoundButton
           android.widget.CheckBox

这是 CheckBox 小部件的继承层次结构。Button 小部件是其父代之一。

AndroidManifest.xml
<?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>

清单文件。

main.xml
<?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 小部件。

strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">CheckBox</string>
    <string name="cblabel">Show title</string>
</resources>

字符串资源。

MainActivity.java
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() 方法修改。

CheckBox widget
图示:CheckBox 小部件

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