1.1. 常用控件
Android的界面是由各种控件组成的。我们首先需要了解每个控件都是做什么的,有哪些控件比较好用。这样才能在开发时找到最适合自己需求的控件,创建出活泼多彩的界面。
1.1.1.文本框TextView
文本框TextView是用来显示一段文字的。我们可以设置文本框的大小、位置、字体大小、字体颜色、文本框背景颜色以及文本框的行数等等,是一个非常基础非常好用的控件,下面我们来介绍TextView的具体用法。
新建Android工程,命名为Chapter05_20,并创建一个名为ViewTextActivity的类。先写一个布局文件用来展示TextView,将布局文件命名为text.xml,内容如下:
text.xml代码清单5-4:
<?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">
<TextView
android:id="@+id/text_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="#ffffff"
android:padding="10dp"
android:background="#cc0000"
android:text="这是一个TextView,这段文字来源于text.xml布局文件。"/>
</LinearLayout>
在text.xml布局文件里面,我们配置了一个文本框,其id为text_view,其中的文本大小为16sp。文本的颜色为一个16进制的数字,全f表示白色,padding为10dip表示该TextView的内边框是10dp。其中sp、dp都是像素单位,详细的我们后面再介绍。background也被设置了一串16进制数,可以表示一种颜色。这里将背景设置为了红色。
ViewTextActivity.java代码清单5-4:
/**
*TextView展示类
* @author孔明
*/
publicclass ViewTextActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置本Activity的标题
setTitle("ViewTextActivity");
// 设置本Activity实用的布局文件
setContentView(R.layout.text);
// 调用私有方法修改TextView的值
findAndModifyTextView();
}
private void findAndModifyTextView() {
//通过id加载TextView的对象
TextView textView = (TextView) findViewById(R.id.text_view);
//获取TextView原来设置的文本
CharSequencetextViewOld = textView.getText();
//设置新的文本
textView.setText("text.xml文件里配置的文字是:" + textViewOld
+"\n在此我们动态修改为:TextView的值也是可以动态修改的.");
}
}
在这段代码里,在onCreate方法里,我们设置了本Activity的标题和布局,并调用私有方法来修改TextView的值,在findAndModifyTextView()里我们通过id来加载了配置在text.xml布局文件里的TextView,并用getText()方法获取了原先设置的TextView的值,随后又用setText()方法将其修改为程序里面写的新值。运行上面的程序,截图如5-7所示:
图5-7 TextView控件示意图
TextView还有许多其他的非常有趣的属性,可以实现更加复杂的功能,在此作一介绍。如下表所示:
属性名 | 属性值 |
android:ems | 设置TextView的宽度为N个字符的宽度。 |
android:maxems | 设置TextView的宽度为最长为N个字符的宽度。与ems同时使用时覆盖ems选项。 |
android:minems | 设置TextView的宽度为最短为N个字符的宽度。与ems同时使用时覆盖ems选项。 |
android:maxLength | 限制输入字符数。如设置为5,那么仅可以输入5个汉字/数字/英文字母。 |
android:lines | 设置文本的行数,设置两行就显示两行,即使第二行没有数据。 |
android:maxLines | 设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示。 |
android:minLines | 设置文本的最小行数,与lines类似。 |
android:lineSpacingExtra | 设置行间距。 |
android:lineSpacingMultiplier | 设置行间距的倍数,如”1.2”。 |
android:singleLine | 设置单行显示。如果和layout_width一起使用,当文本不能全部显示时,后面用“…”来表示。如果不设置singleLine或者设置为false,文本将自动换行。 |
android:textColorHighlight | 被选中文字的底色,默认为蓝色。 |
android:textColorLink | 文字链接的颜色。 |
在了解上表缩写的属性之后,我们可以实现更加有趣的功能,比如TextView的内容比较长,我们还可以通过设置android:maxLines属性配合Button来实现我们常常见到的“展开”和“收起”的功能。当然TextView还有其他的属性,就等待读者慢慢去发掘了。
1.1.2.按钮Button
按钮也是一个非常简单且好用的控件。在5.1.6节,我们已经在介绍硬编码和xml文件控制布局的同时也介绍了按钮的基本用法。我们可以看出,Button的用法跟TextView没有太大的区别,只不过,在一般情况下,我们需要为Button定义一个监听器。为了我们后续的工程实现,我们利用Button为我们的示例工程来做一个引导界面。我们在5.2.1的工程里面新建一个名为Chapter05_20Activity的类,代码如下:
Chapter05_20Activity.java代码清单5-5:
/**
* 引导界面,示例Button的用法
* @author孔明
*/
publicclass Chapter05_20Activity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置布局文件
setContentView(R.layout.main);
// 通过id返回布局文件中定义的button
Button textViewButton= (Button)findViewById(R.id.text_view_button);
// 设置监听器
textViewButton.setOnClickListener(mTextViewButtonListener);
}
// textViewButton的监听器
private Button.OnClickListener mTextViewButtonListener = new Button.OnClickListener() {
@Override
publicvoid onClick(View v) {
// 创建一个Intent
Intent intent = new Intent(Chapter05_20Activity.this, ViewTextActivity.class);
// 启动Intent对应的Activity
startActivity(intent);
}
};
}
上述代码完成的功能是通过点击一个按钮来启动5.2.1当中的ViewTextActivity。该类对应的布局文件为main.xml,内容如下:
main.xml代码清单5-5:
<?xmlversion="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/text_view_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="TextView"/>
</LinearLayout>
运行程序,截图如5-8所示:
图5-8 Button控件示意图
点击按钮之后就会出现5.2.1当中所讲的界面。按钮还有其他的属性,在此我们列表如下:
属性名 | 属性值 |
android:clickable | 设置按钮是否可点击。 |
android:longClickable | 设置按钮是否可以长按。 |
Android:background | 设置按钮的背景图片。 |
孔明:代码中我们用到了Intent。Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,架起了调用者与被调用者之间的桥梁。
|
1.1.3.编辑框EditText
编辑框与文本框TextView不同的是可以让用户用来输入一段文字。在Android API中EditText是TextView的子类,所以TextView拥有的属性,EditText也有,但EditText也有有一些TextView所没有的属性,比如可以设置只能输入数字,手机号码或者设置允许输入的字符等等。下面先来看一个简单的例子,在Chapter05_20工程中新建一个类,命名为EditTextActivity,并在Chapter05_20Activity中增加一个按钮,EditTextActivity通过点击按钮来启动。EditTextActivity具体代码如下:
EditTextActivity.java代码清单5-6:
/**
*EditText展示类
* @author孔明
*/
publicclass EditTextActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置标题
setTitle("EditTextActivity");
//指定布局文件
setContentView(R.layout.editview);
//通过id来加载按钮
Button getEditViewButton = (Button) findViewById(R.id.get_edit_view_button);
//设置按钮的监听器
getEditViewButton.setOnClickListener(getEditViewButtonListener);
}
//定义button的监听器
private Button.OnClickListener getEditViewButtonListener = new Button.OnClickListener()
{
@Override
public void onClick(View v) {
//通过id来加载EditText
EditText editText = (EditText) findViewById(R.id.edit_text);
//调用getText()来获取文本编辑框里面输入的内容
CharSequence editTextValue = editText.getText();
//设置标题为上述的内容
setTitle("EditText的值:"+editTextValue);
}
};
}
该类对应的布局文件editview.xml为如下:
editview.xml代码清单5-6:
<?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">
<EditText android:id="@+id/edit_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="这里可以输入文字"/>
<Button android:id="@+id/get_edit_view_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取EditView的值"/>
</LinearLayout>
运行程序后,我们点击EditText的输入框,出现如5-9所示界面:
图5-9 EditText控件示意图
然后我们输入“FirstPeopleStudio”,然后点击按钮,出现如5-10所示界面:
图5-10 EditText控件输入文字示意图
可以看到标题已经被设置成了我们输入的内容。EditText还有许多其他的内容,可以完成非常精致的操作,我们来看下EditText的其他属性,如下表所示:
属性名 | 属性值 |
android:textColorHint | 设置提示信息文字的颜色,默认为灰色,与hint一起使用。 |
android:numeric | 如果被设置,该TextView有一个数字输入法,只能输入数字,有如下值设置:integer正整数、signed带符号整数、decimal带小数点浮点数。 |
android:password | 以小点“· ”显示文本 |
android:digits | 设置只接受某些数字 |
Android:editable | 设置是否可编辑 |
android:cursorVisible | 设定光标为显示/隐藏,默认为显示 |
android:phoneNumber | 设置为电话号码的输入方式。 |
孔明:哈哈,根据前面介绍的三个控件,TextView,Button和EditText,我们就可以制作一个简单的登录界面了哦~就是这么简单!
|
1.1.4.自动提示AutoCompleteTextView
AutoCompleteTextView是一种能够根据输入自动补全的文本输入框。大家在平时使用百度或者google时都会有类似的经历。在输入一些文字的时候,会给出一些提示,用户可以直接点击提示自动补全内容。在本节,我们来简单看一下在Android上,这种自动补全的功能是如何实现的。
在5.2.1的工程中再写一个新类,命名为AutoCompleteTextViewActivity,具体代码如下:
AutoCompleteTextViewActivity.java代码清单5-7:
/**
* AutoCompleteTextView展示类
* @author孔明
*/
publicclass AutoCompleteTextViewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置布局文件
setContentView(R.layout.autocomplete);
// 设置标题
setTitle("AutoCompleteTextViewActivity");
// 用字符创数组生成一个适配器
// 其中的simple_dropdown_item_1line是Android的自带布局
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line,COUNTRIES);
// 通过id加载控件
AutoCompleteTextView textView =
(AutoCompleteTextView)findViewById(R.id.auto_complete);
// 设置适配器
textView.setAdapter(adapter);
}
// 定义字符串数组
staticfinal String[] COUNTRIES= new String[] {
"China", "Russia","Germany", "Ukraine", "Belarus", "USA","China1", "China12",
"Germany","Russia2", "Belarus", "USA"
};
}
此类所使用的布局文件autocomplete.xml:
autocomplete.xml代码清单5-7:
<?xml version=“1.0” encoding=“utf-8”?>
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/androidandroid:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<AutoCompleteTextView
android:id="@+id/auto_complete"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
布局文件很简单,只包含了一个简单的AutoCompleteTextView控件。我们运行程序,并在输入框里面输入“Ch”,程序截图如5-11所示:
图5-11 AutoCompleteTextView控件示意图
刘备:孔明,我看这个像是EditText的升级版啊! 孔明:聪明!
|
在本例中,我们用到了ArrayAdapter,并将ArrayAdapter中的泛型指定为字符串,那么什么是ArrayAdapter呢,为什么要用ArrayAdapter呢?Adapter是连接后台数据与前端显示的适配器,是数据和UI之间的桥梁。在Android当中,包括后面将要讲到的GridView,ListView等许多地方都需要用到Adapter。我们用图5-12来表示数据,Adapter和UI之间的关系:
Adapter 适配器 |
View 视图组件 |
Data 数据源 |
图5-12 数据源,适配器与视图组件的关系示意图
在Android中,Adapter是一个接口,它有很多的具体实现子类,包括ArrayAdapter,BaseAdapter,CursorAdapter,HeaderViewListAdapter,ListAdapter,ResourceCursorAdapter,SimpleAdapter,SimpleCursorAdapter,SpinnerAdapter,WrapperListAdapter等,但是最常用的就是以下四个Adapter:
BaseAdapter:这是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性,我们以后编程过程中用到的自定义的Adapter,很多都是继承此类来实现的。
ArrayAdapter:支持泛型操作,最为简单,数据可以用数组来定义。
SimpleAdapter:有最好的扩充性,可以自定义出各种效果。
SimpleCursorAdapter:可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,方便地把数据库的内容以列表的形式展示出来。
1.1.5.单项选择RadioGroup和RadioButton
单项选择框是由RadioGroup和RadioButton组成的,RadioButton是一个单选框,而RadioGroup是一组单选框的集合。下面我们来看一个具体的示例。
在5.2.1的工程里面增加一个新类,命名为RadioGroupActivity,具体的代码如下:
RadioGroupActivity.java代码清单5-8:
/**
*单选框RadioGroup展示类
* @author孔明
*/
publicclass RadioGroupActivity extends Activity implementsView.OnClickListener {
private RadioGroup mRadioGroup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载布局文件
setContentView(R.layout.radio_group);
//设置标题
setTitle("RadioGroupActivity");
//通过id加载单选框
mRadioGroup = (RadioGroup) findViewById(R.id.menu);
//通过id加载清除按钮
Button clearButton = (Button) findViewById(R.id.clear);
//设置清除按钮的监听器为Activity本身
clearButton.setOnClickListener(this);
}
//实现监听器的方法,当点击清除时,单选组内的选择将被清除。
public void onClick(View v) {
mRadioGroup.clearCheck();
}
}
该类所用的布局为radio_group.xml文件,内容如下:
radio_group.xml代码清单5-8:
<?xml version=“1.0” encoding=“utf-8”?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<RadioGroup
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:checkedButton="@+id/drawing"
android:id="@+id/menu">
<RadioButton
android:text="@string/words"
android:id="@+id/words"/>
<RadioButton
android:text="@string/drawing"
android:id="@id/drawing"/>
<RadioButton
android:text="@string/legned"
android:id="@+id/legned"/>
<RadioButton
android:text="@string/all"
android:id="@+id/all"/>
</RadioGroup>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清除"
android:id="@+id/clear"/>
</LinearLayout>
在布局文件里面我们定义了一个RadioGroup,id为menu,在这个RadioGroup里面我们定义了四个RadioButton,除此之外,我们还定义了一个Button,用来完成清除选择的操作。运行程序,截图如5-13所示:
图5-13 RadioGroup和RadioButton控件示意图
在程序里面,所有的这些选项同时只能有一个可以被选择,点击清除按钮之后,选择将会被清除掉。
1.1.6.多项选择CheckBox
5.2.5的RadioGroup和RadioButton实现了单项选择,那么假如是需要多项选择的情况下,又该使用哪个控件呢?这时我们将会用的CheckBox组件。下面我们通过示例来讲解CheckBox的具体用法。在5.2.1的工程里面增加新类,命名为CheckBoxActivity,具体代码如下:
CheckBoxActivity.java代码清单5-9:
/**
*复选框CheckBox展示类
*
* @author孔明
*/
publicclass CheckBoxActivity extends Activity {
private CheckBox mPlainCB;
private CheckBox mSerifCB;
private CheckBox mItalicCB;
private CheckBox mBoldCB;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置标题
setTitle("CheckBoxActivity");
// 设置布局文件
setContentView(R.layout.check_box);
// 通过id加载复选框
mPlainCB = (CheckBox)findViewById(R.id.plain_cb);
mSerifCB = (CheckBox)findViewById(R.id.serif_cb);
mItalicCB = (CheckBox)findViewById(R.id.italic_cb);
mBoldCB = (CheckBox)findViewById(R.id.bold_cb);
// 通过id加载按钮并设置按钮的监听器
Button getViewButton = (Button)findViewById(R.id.get_view_button);
getViewButton.setOnClickListener(getViewButtonListener);
}
// button的监听器
private Button.OnClickListener getViewButtonListener = new Button.OnClickListener() {
public void onClick(View v) {
String r = "";
// 如果复选框被选择了,那么就在显示的文本上增加本选项的内容
if (mPlainCB.isChecked()) {
r = r + "," + mPlainCB.getText();
}
if (mSerifCB.isChecked()) {
r = r + "," + mSerifCB.getText();
}
if (mItalicCB.isChecked()) {
r = r + "," + mItalicCB.getText();
}
if (mBoldCB.isChecked()) {
r = r + "," + mBoldCB.getText();
}
// 在标题上显示出所选择的复选框的内容
setTitle("Checked: " + r);
}
};
}
该类使用的布局为check_box.xml,内容为:
check_box.xml代码清单5-9:
<?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">
<CheckBoxandroid:id="@+id/plain_cb"
android:text="@string/words"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBoxandroid:id="@+id/serif_cb"
android:text="@string/drawing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:typeface="serif"/>
<CheckBoxandroid:id="@+id/bold_cb"
android:text="@string/legned"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"/>
<CheckBoxandroid:id="@+id/italic_cb"
android:text="@string/all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="italic"/>
<Button android:id="@+id/get_view_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取CheckBox的值"/>
</LinearLayout>
在布局文件里,我们定义了四个复选框和一个按钮,按钮用来获取我们选择的内容,运行程序,我们截图如5-14所示:
图5-14 CheckBox组件示意图
点击按钮,我们把选择的内容显示到标题上去。下面我们把CheckBox新出现的属性的作用总结如下:
属性名 | 属性值 |
android:checked | 设置该多选框是否被选择。 |
android:textStyle | 设置文字的风格,有normal,bold和italic三种。 |
android:typeface | 设置字体,有normal,serif,sans,monospace四种。 |
比较5.2.5,细心的读者会发现,单项选择用了两种组件来配合完成的,一个RadioGroup和一组RadioButton,而多项选择只用了一种组件,即CheckBox。那这是为什么呢?原因是当一组多项选择框中的某一个被选中的时候,我们不需要考虑其他多项选择框的状态,即多项选择框之间相互独立,互不影响,而一组单项选择框中的某一个被选中的时候,系统首先要将该组中已被选中的选项取消选择,同时将我们选择的那一项置为选择,因此,需要两种组件来配合完成单项选择。
孔明:上面说的都是默认的单选和复选的风格,我们在使用的时候呢,完全可以自定义一些风格,展现编程大牛的风采! |
1.1.7.下拉列表Spinner
下拉列表对于很多用户来说都不陌生,不管是网页还是Excel等软件中都提供了下拉列表的功能,当然Android也不例外, Android提供了Spinner组件,可以帮助开发者迅速地完成下拉列表。下拉列表主要适用于需要给用户提供几个选项的场景。下面让我们来看一下在Android上如何实现下拉列表。我们在5.2.1工程里面新建一个Activity并命名为SpinnerActivity,具体代码如下:
SpinnerActivity.java代码清单5-10:
/**
*Spinner展示类
* @author孔明
*/
publicclass SpinnerActivity extends Activity {
// 定义两个下拉列表的引用
private Spinner mSpinner_1;
private Spinner mSpinner_2;
private ArrayAdapter<String> firstPeopleApps;
private List<String> mAllApps;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置标题
setTitle("SpinnerActivity");
// 设置布局
setContentView(R.layout.spinner);
find_and_modify_view();
}
// 定义字符串组
private static final String[] mAppName= {
"刀疤鸭画图板", "刀疤鸭传说", "刀疤鸭背单词", "刀疤鸭无双"
};
private void find_and_modify_view() {
// 通过id来加载组件
mSpinner_1 = (Spinner)findViewById(R.id.spinner_1);
// 设置一个ArrayList,作为适配器的输入参数
mAllApps = newArrayList<String>();
for (int i = 0; i <mAppName.length; i++) {
mAllApps.add(mAppName[i]);
}
// 设置一个ArrayAdapter,其中使用了上面的ArrayList,使用系统自带的布局文件
firstPeopleApps = newArrayAdapter<String>(this,
android.R.layout.simple_spinner_item,mAllApps);
// 设置下拉列表的布局文件,也可以使用自己定义的布局文件
firstPeopleApps.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
// 设置下拉列表的Adapter
mSpinner_1.setAdapter(firstPeopleApps);
// 通过id来加载第二个组件
mSpinner_2 = (Spinner)findViewById(R.id.spinner_2);
// 使用xml配置文件里面定义的字符串数组来声明一个ArrayAdapter
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.countries, android.R.layout.simple_spinner_item);
// 设置下拉列表的布局文件,也可以使用自己定义的布局文件
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
// 设置下拉列表的Adapter
mSpinner_2.setAdapter(adapter);
}
}
我们在代码里面添加了两个下拉列表,即Spinner组件,是为了说明下拉列表Spinner的两种数据填充方式,一种是在程序里面定义List,用来填充Spinner,另外一种是用xml文件定义字符串数组的方式进行填充Spinner。相比较而言,用xml配置的方式更有利于以后的扩充。上述代码用到的布局文件spinnner.xml内容如下:
spinnner.xml代码清单5-10:
<?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">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Spinner_1使用硬编码定义的字符串数组"/>
<Spinner
android:id="@+id/spinner_1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="false"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Spinner_2使用xml定义的字符串数组"/>
<Spinner
android:id="@+id/spinner_2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="false"/>
</LinearLayout>
可以看出布局文件非常简单,只是包含了两个TextView和两个Spinner组件。然而,我们程序里面的第二个Spinner使用的是xml文件配置的字符串数组,该xml文件名为arrays.xml,位于values文件夹下,内容如下:
arrays.xml代码清单5-10:
<?xml version=“1.0” encoding=“utf-8”?>
<resources>
<string-arrayname="countries">
<item>刀疤鸭画图板</item>
<item>刀疤鸭传说</item>
<item>刀疤鸭背单词</item>
<item>刀疤鸭无双</item>
</string-array>
</resources>
我们运行程序,截图如5-15所示:
图5-15 Spinner组件示意图
当我们点击第一个或者第二个下拉列表的时候就会出现如下5-16所示界面,两个下拉列表的界面是完全一样的。
图5-16 Spinner组件点击事件示意图
1.1.8.日期和时间DatePicker、TimePicker
本节我们来看一下Android系统中的日期和时间组件是如何使用的。相信有Android手机的人一定使用过这两个组件的功能,那么如何在程序里边调用Android系统的这两个组件呢,我们来看下面这个示例。在5.2.1的工程里面再增加一个新的类,命名为DatePickerActivity,该类的具体代码如下:
DatePickerActivity.java代码清单5-11:
/**
* DatePicker展示类,Android日期设置展示。
*
* @author孔明
*/
publicclass DatePickerActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置标题
setTitle("CheckBoxActivity");
// 设置布局
setContentView(R.layout.date_picker);
// 通过id来加载组件
DatePicker dp = (DatePicker)this.findViewById(R.id.date_picker);
// 设置初始时间,分别为年,月,日
// 最后一个参数为监听器,当时间改变的时候会执行的,在此设置为null
dp.init(2012, 7, 2, null);
}
}
对应的布局文件为date_picker.xml,内容如下:
date_picker.xml代码清单5-11:
<?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="wrap_content">
<DatePicker
android:id="@+id/date_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
运行程序,截图如5-17所示:
图5-17 DatePicker组件示意图
我们看到程序初始设置的时间为2012年8月2日,但是我们程序里面设置的初始参数是2012,7,2,这是因为在Android中,月份是用0~11来表示的,即7表示的是八月份的意思。
孔明:悄悄告诉你们,Android的月份的这种设定,在Java中使用Calendar设置月份时也是这样的。 |
时间的设置跟日期设置类似,我们在工程里面新建一个类,并命名为TimePickerActivity,该类的代码如下:
TimePickerActivity.java代码清单5-12:
/**
* TimePicker展示类,Android时间设置展示。
*
* @author孔明
*/
publicclass TimePickerActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置标题
setTitle("TimePickerActivity");
// 设置布局
setContentView(R.layout.time_picker);
// 通过id来得到组件的引用
TimePicker tp = (TimePicker)this.findViewById(R.id.time_picker);
// 设置使用24小时的模式
tp.setIs24HourView(true);
}
}
使用的布局文件也非常简单,time_picker.xml为:
time_picker.xml代码清单5-12:
<?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="wrap_content">
<TimePicker
android:id="@+id/time_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
运行效果如图5-18所示,我们可以通过点击“+”和“-”来控制时间。
图5-18 TimePicker组件示意图
1.1.9.提示Toast
Toast就是提示,是个常用的控件。当然没有使用过Android手机的人可能并不知道Android的提示到底是什么效果,我们先来贴一张我们将要展示的程序的运行的图片,如图5-19所示:
图5-19 Toast组件示意图
Android中的Toast就是在界面上显示一小段时间的一个提示,这个提示可以是文字图片或者是文字与图片相结合的形式。在图5-19中,我们展示了一个非常基本的Toast的效果。为了说明Toast的使用方法,我们在工程里面新建一个类,命名为ToastActivity,代码如下:
ToastActivity.java代码清单5-13:
/**
* Toast展示类
*
* @author孔明
*
*/
publicclass ToastActivity extends Activity {
// 定义一个按钮,当按此按钮时会出现系统默认的Toast
private Button mDefaultToastBtn = null;
// 定义一个按钮比,当按此按钮时会出现自定义的Toast
private Button mUserDefineToastBtn = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置布局文件
setContentView(R.layout.toast);
// 通过id加载两个定义在布局文件里的按钮,并设置监听器
mDefaultToastBtn = (Button) findViewById(R.id.default_toast_btn);
mDefaultToastBtn.setOnClickListener(mDefaultToastBtnListener);
mUserDefineToastBtn = (Button) findViewById(R.id.user_define_toast_btn);
mUserDefineToastBtn.setOnClickListener(mUserDefineToastBtnListener);
}
// 设置系统默认Toast按钮的监听器
private OnClickListener mDefaultToastBtnListener = new OnClickListener(){
@Override
public void onClick(View v) {
// 系统默认的Toast的调用方式,第一个参数为Context
// 第二个为将要显示的字符串,第三个为显示的时间
// 在show()方法之前将会返回一个Toast对象
// 最后再调用该对象的show()方法
Toast.makeText(ToastActivity.this, "系统默认的Toast",
Toast.LENGTH_SHORT).show();
}
};
// 设置自定义Toast按钮的监听器
private OnClickListener mUserDefineToastBtnListener = new OnClickListener(){
@Override
public void onClick(View v) {
// 通过Toast类的静态方法makeText()返回一个Toast引用
// 并设置该Toast对象需要显示的字符串
Toast toast = Toast.makeText(getApplicationContext(), "带图片的Toast",
Toast.LENGTH_LONG);
// 设置toast的位置为中心
toast.setGravity(Gravity.CENTER, 0, 0);
// 获取toast的布局,并将其转化为线性布局
LinearLayout toastView = (LinearLayout) toast.getView();
// 新生成一个ImageView
ImageView imageView = new ImageView(getApplicationContext());
// 设置ImageView的图像来源
imageView.setImageResource(R.drawable.icon);
// 将此ImageView加入到toast的线性布局中
toastView.addView(imageView, 0);
// 最后让toast显示出来
toast.show();
}
};
}
代码里面展示了一类最基本的系统自定义的Toast的使用方法,还定义了一种用户自定义的Toast的使用方法。该类用到的布局文件toast.xml为:
toast.xml代码清单5-13:
<?xml version=“1.0” encoding=“utf-8”?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button
android:id="@+id/default_toast_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="系统默认的Toast"/>"
<Button
android:id="@+id/user_define_toast_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="自定义的Toast"/>
</LinearLayout>
当点击自定义Toast那个按钮时,运行效果如图5-20所示:
图5-20 自定义的Toast组件示意图
可以看出,如果想自定义Toast,那么必须获得Toast的对象,获得对象之后就可以设置Toast的位置以及获得其使用的View框架,然后在View里面设置自己定义好的View就可以了。在这个例子里面我们用到了ImageView,我们将在下一节当中介绍。
孔明:一般情况下,使用系统默认的Toast就可以了,只有在游戏或者有特殊需求的时候才使用自定义的Toast。 |