第5回 二弟呀,面子工程很重要

 

 

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。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值