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 开发教程中,我们介绍了按钮小部件。