Android 中常见控件的介绍和使用

1 TextView文本框

1.1 TextView类的结构

TextView 是用于显示字符串的组件,对于用户来讲就是屏幕中一块用于显示文本的区域。TextView类的层次关系以下:php

java.lang.Objecthtml

    ↳ android.view.Viewjava

    ↳ android.widget.TextViewandroid

直接子类:git

  Button, CheckedTextView, Chronometer, DigitalClock, EditTextgithub

间接子类:web

  AutoCompleteTextView, CheckBox, CompoundButton, ExtractEditText,MultiAutoCompleteTextView, RadioButton, ToggleButton编程

1.2 TextView类的方法

主要方法canvas

功能描述windows

返回值

TextView

TextView的构造方法

Null

getDefaultMovementmethod

获取默认的箭头按键移动方式

Movementmethod

getText

得到TextView对象的文本

CharSquence

length

得到TextView中的文本长度

Int

getEditableText

取得文本的可编辑对象,经过 这个对象可对TextView的文本进行操做,如在光标以后插入字符

Void

getCompoundPaddingBottom

返回底部填充物

Int

setCompoundDrawables

设置图像显示的位置,在 设置该Drawable资源以前须要调用setBounds(Rect)

Void

setCompoundDrawablesWithIn

trinsicBounds

设置Drawable图像的显示位置,但其边界不变

Void

setPadding

根据位置设置填充物

Void

getAutoLinkMask

返回自动链接的掩码

Void

setTextColor

设置文本显示的颜色

Void

setHighlightColor

设置文本选中时显示的颜色

Void

setShadowLayer

设置文本显示的阴影颜色

Void

setHintTextColor

设置提示文字的颜色

Void

setLinkTextColor

设置连接文字的颜色

Void

setGravity

设置当TextView超出了文本自己时横向以及垂直对齐

Void

getFreezesText

设置该视图是否包含整个文本,若是包含则返回真值,不然返回假值

Boolean

 

 

 

 

1.3 TextView标签的属性

XML属性

属性名称

描述

android:autoLink

设置是否当文本为URL连接/email/电话号码/map时,文本显示为可点击的连接。可选值(none/web/email/phone/map/all)

android:autoText

若是设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起做用。

android:bufferType

指定getText()方式取得的文本类别。选项editable 相似于StringBuilder可追加字符,

也就是说getText后可调用append方法设置文本内容。

android:capitalize

设置英文字母大写类型。此处无效果,须要弹出输入法才能看获得,参见EditView此属性说明。

android:cursorVisible

设定光标为显示/隐藏,默认显示。

android:digits

设置容许输入哪些字符。如“1234567890.+-*/%\n()”

android:drawableBottom

在text的下方输出一个drawable,如图片。若是指定一个颜色的话会把text的背景设为该颜色,而且同时和background使用时覆盖后者。

android:drawableLeft

在text的左边输出一个drawable,如图片。

android:drawablePadding

设置text与drawable(图片)的间隔,与drawableLeft、drawableRight、drawableTop、drawableBottom一块儿使用,可设置为负数,单独使用没有效果。

android:drawableRight

在text的右边输出一个drawable,如图片。

android:drawableTop

在text的正上方输出一个drawable,如图片。

android:editable

设置是否可编辑。这里无效果,参见EditView。

android:editorExtras

设置文本的额外的输入数据。在EditView再讨论。

android:ellipsize

设置当文字过长时,该控件该如何显示。有以下值设置:”start”—–省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)

android:freezesText

设置保存文本的内容以及光标的位置。

android:gravity

设置文本位置,如设置成“center”,文本将居中显示。

android:hint

Text为空时显示的文字提示信息,可经过textColorHint设置提示信息的颜色。比较奇怪的是TextView原本就至关于Label,怎么会不设置Text?!

android:imeOptions

附加功能,设置右下角IME动做与编辑框相关的动做,如actionDone右下角将显示一个“完成”,而不设置默认是一个回车符号。这个在EditView中再详细说明,此处无用。

android:imeActionId

设置IME动做ID。在EditView再作说明,

android:imeActionLabel

设置IME动做标签。在EditView再作说明。

android:includeFontPadding

设置文本是否包含顶部和底部额外空白,默认为true。

android:inputMethod

为文本指定输入法,须要彻底限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,可是这里报错找不到。

android:inputType

设置文本的类型,用于帮助输入法显示合适的键盘类型。在EditView中再详细说明,这里无效果。

android:linksClickable

设置连接是否点击链接,即便设置了autoLink。

android:marqueeRepeatLimit

在ellipsize指定marquee的状况下,设置重复滚动的次数,当设置为marquee_forever时表示无限次。

android:ems

设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度,如图:

android:maxEms

设置TextView的宽度为最长为N个字符的宽度。与ems同时使用时覆盖ems选项。

android:minEms

设置TextView的宽度为最短为N个字符的宽度。与ems同时使用时覆盖ems选项。

android:maxLength

限制显示的文本长度,超出部分不显示。

android:lines

设置文本的行数,设置两行就显示两行,即便第二行没有数据。

android:maxLines

设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示。

android:minLines

设置文本的最小行数,与lines相似。

android:lineSpacingExtra

设置行间距。

android:lineSpacingMultiplier

设置行间距的倍数。如”1.2”

android:numeric

若是被设置,该TextView有一个数字输入法。此处无用,设置后惟一效果是TextView有点击效果,此属性在EdtiView将详细说明。

android:password

以小点”.”显示文本

android:phoneNumber

设置为电话号码的输入方式。

android:privateImeOptions

设置输入法选项,此处无用,在EditText将进一步讨论。

android:scrollHorizontally

设置文本超出TextView的宽度的状况下,是否出现横拉条。

android:selectAllOnFocus

若是文本是可选择的,让他获取焦点而不是将光标移动为文本的开始位置或者末尾位置。TextView中设置后无效果。

android:shadowColor

指定文本阴影的颜色,须要与shadowRadius一块儿使用。效果:

android:shadowDx

设置阴影横向坐标开始位置。

android:shadowDy

设置阴影纵向坐标开始位置。

android:shadowRadius

设置阴影的半径。设置为0.1就变成字体的颜色了,通常设置为3.0的效果比较好。

android:singleLine

设置单行显示。若是和layout_width一块儿使用,当文本不能所有显示时,后面用“…”来表示。如android:text="test_ singleLine " android:singleLine="true" android:layout_width="20dp"将只显示“t…”。若是不设置singleLine或者设置为false,文本将自动换行

android:text

设置显示文本.

android:textAppearance

设置文字外观。如“?android:attr/textAppearanceLargeInverse

”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,不然使用默认的外观。可设置的值以下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse

android:textColor

设置文本颜色

android:textColorHighlight

被选中文字的底色,默认为蓝色

android:textColorHint

设置提示信息文字的颜色,默认为灰色。与hint一块儿使用。

android:textColorLink

文字连接的颜色.

android:textScaleX

设置文字之间间隔,默认为1.0f。分别设置0.5f/1.0f/1.5f/2.0f效果以下:

 

android:textSize

设置文字大小,推荐度量单位”sp”,如”15sp”

android:textStyle

设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 能够设置一个或多个,用“|”隔开

android:typeface

设置文本字体,必须是如下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3]

android:height

设置文本区域的高度,支持度量单位:px(像素)/dp/sp/in/mm(毫米)

android:maxHeight

设置文本区域的最大高度

android:minHeight

设置文本区域的最小高度

android:width

设置文本区域的宽度,支持度量单位:px(像素)/dp/sp/in/mm(毫米)。

android:maxWidth

设置文本区域的最大宽度

android:minWidth

设置文本区域的最小宽度

 

 

1.4 TextView的使用

咱们能够在XML布局文件中声明及设置TextView,也能够在代码中生成TextView组件。

在xml布局中:

 //显示超连接:

<TextView android:id="@+id/textView0" android:layout_width="fill_parent" android:layout_height="wrap_content"

android:textColor="#FF0000"

android:textSize="18dip" android:background="#FFFFFF" android:text="拨打手机:13888888888"

android:gravity="center_vertical|center_horizontal" android:autoLink="phone" />

 

<TextView android:id="@+id/textView1" android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:textColor="#FF0000"

android:textSize="18dip" android:background="#00FF00"

android:text="Google搜索:http://www.google.com.hk" android:gravity="center_vertical|center_horizontal"

android:autoLink="web" />

 

<TextView android:id="@+id/textView2" android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:textColor="#FF0000"

android:textSize="18dip"

android:background="#FFFF00"

android:text="发送邮件:1007857613@qq.com"

android:gravity="center_vertical|center_horizontal" android:autoLink="email" />

 

//设置文字的滚屏

<TextView android:id="@+id/textView3" android:layout_width="fill_parent"

android:layout_height="20dp" android:textSize="18dip"

android:ellipsize="marquee" android:focusable="true"

android:marqueeRepeatLimit="marquee_forever"

android:focusableInTouchMode="true"

android:scrollHorizontally="true"

android:text="文字滚屏文字跑马灯效果加长加长加长加长加长加长加长加长加长加长加长加长"

android:background="#FF0000"

android:textColor="#FFFFFF">

   </TextView>

 

//设置字符阴影

<TextView android:id="@+id/TextView4" android:layout_width="fill_parent"

android:layout_height="wrap_content" android:textSize="18dip"

android:background="#69541b" android:textColor="#FFFFFF" android:text="设置字符串阴影颜色为绿色"

android:shadowColor="#45b97c" android:shadowRadius="3.0"

android:gravity="center_vertical|center_horizontal" />

   //设置字符的外形

<TextView android:layout_width="fill_parent"

android:layout_height="wrap_content" android:textSize="18dip"

android:background="#FFFFFF" android:textColor="#FF0000" android:text="设置文字外形为italic"

android:textStyle="italic" android:gravity="center_vertical|center_horizontal" />

 

</LinearLayout>

 

在代码中:

/动态建立textView

      linearLayout = (LinearLayout)findViewById(R.id.linearLayout01);

      param  = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,

           LinearLayout.LayoutParams.WRAP_CONTENT);

        LinearLayout layout1 = new LinearLayout(this);

      layout1.setOrientation(LinearLayout.HORIZONTAL);

        TextView tv = new TextView(this);

        tv.setId(200);

        tv.setText("动态建立TextView");

        tv.setBackgroundColor(Color.GREEN);

        tv.setTextColor(Color.RED);

        tv.setTextSize(20);

        layout1.addView(tv, param);

        linearLayout.addView(layout1, param);

 

效果图:

 

 

 

2 EditText编辑框

2.1 EditText类的结构

EditText和TextView的功能基本相似,他们之间的主要区别在于EditText提供了可编辑的文本框。

java.lang.Object

android.view.View

android.widget.TextView        

android.widget.EditText

 

直接子类:

AutoCompleteTextView, ExtractEditText

 

间接子类:

MultiAutoCompleteTextView

 

2.2 EditText经常使用的方法

方法

功能描述

返回值

setImeOptions

设置软键盘的Enter键

void

getImeActionLable

设置IME动做标签

Charsequence

getDefaultEditable

获取是否默承认编辑

boolean

setEllipse

设置文件过长时控件的显示方式

void

setFreeezesText

设置保存文本内容及光标位置

void

getFreeezesText

获取保存文本内容及光标位置

boolean

setGravity

设置文本框在布局中的位置

void

getGravity

获取文本框在布局中的位置

int

setHint

设置文本框为空时,文本框默认显示的 字符

void

getHint

获取文本框为空时,文本框默认显示的 字符

Charsequence

setIncludeFontPadding

设置文本框是否包含底部和顶端的额外空白

void

setMarqueeRepeatLimit

在ellipsize指定marquee的状况下,设置重复滚动的次数,

当设置为marquee_forever时表示无限次

void

 

2.3 EditText标签的主要属性

属性名称

描述

android:autoLink

设置是否当文本为URL连接/email/电话号码/map时,文本显示为可点击的连接。可选值(none/web/email/phone/map/all)。这里只有在同时设置text时才自动识别连接,后来输入的没法自动识别。

android:autoText

自动拼写帮助。这里单独设置是没有效果的,可能须要其余输入法辅助才行,效果参见视频

android:bufferType

指定getText()方式取得的文本类别。选项editable 相似于StringBuilder可追加字符,

也就是说getText后可调用append方法设置文本内容。spannable 则可在给定的字符区域使用样式,参见这里1这里2

android:capitalize

设置英文字母大写类型。设置以下值:sentences仅第一个字母大写;words每个单词首字母大小,用空格区分单词;characters每个英文字母都大写。在模拟器上用PC键盘直接输入能够出效果,可是用软键盘无效果。

android:cursorVisible

设定光标为显示/隐藏,默认显示。若是设置false,即便选中了也不显示光标栏。

android:digits

设置容许输入哪些字符。如“1234567890.+-*/%\n()”

android:drawableTop

在text的正上方输出一个drawable。在EditView中的效果比较搞笑:,竟然在文本框里,并且删不了。

android:drawableBottom

在text的下方输出一个drawable(如图片)。若是指定一个颜色的话会把text的背景设为该颜色,而且同时和background使用时覆盖后者。

android:drawableLeft

在text的左边输出一个drawable(如图片)。

android:drawablePadding

设置text与drawable(图片)的间隔,与drawableLeft、drawableRight、drawableTop、drawableBottom一块儿使用,可设置为负数,单独使用没有效果。

android:drawableRight

在text的右边输出一个drawable,如图片。

android:editable

设置是否可编辑。仍然能够获取光标,可是没法输入。

android:editorExtras

指定特定输入法的扩展,如“com.mydomain.im.SOME_FIELD”。源码跟踪至EditorInfo.extras,暂无相关实现代码。

android:ellipsize

设置当文字过长时,该控件该如何显示。有以下值设置:”start”—–省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)

android:freezesText

设置保存文本的内容以及光标的位置。参见:这里

android:gravity

设置文本位置,如设置成“center”,文本将居中显示。

android:hint

Text为空时显示的文字提示信息,可经过textColorHint设置提示信息的颜色。

android:imeOptions

设置软键盘的Enter键。有以下值可设置:normal,actionUnspecified,actionNone,actionGo,actionSearch,actionSend,actionNext,actionDone,flagNoExtractUi,flagNoAccessoryAction,flagNoEnterAction。可用’|’设置多个。这里仅设置显示图标之用,参见文章末尾例子。

android:imeActionId

设置IME动做ID,在onEditorAction中捕获判断进行逻辑操做。

android:imeActionLabel

设置IME动做标签。可是不能保证必定会使用,猜测在输入法扩展的时候应该有用。

android:includeFontPadding

设置文本是否包含顶部和底部额外空白,默认为true。

android:inputMethod

为文本指定输入法,须要彻底限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,可是这里报错找不到。关于自定义输入法参见这里

sentences仅第一个字母大写;words每个单词首字母大小,用空格区分单词;characters每个英文字母都大写

android:inputType

设置文本的类型,用于帮助输入法显示合适的键盘类型。有以下值设置:none、text、textCapCharacters字母大小、textCapWords单词首字母大小、textCapSentences仅第一个字母大小、textAutoCorrect、textAutoComplete自动完成、textMultiLine多行输入、textImeMultiLine输入法多行(若是支持)、textNoSuggestions不提示、textEmailAddress电子邮件地址、textEmailSubject邮件主题、textShortMessage短信息(会多一个表情按钮出来,点开以下图:

)、textLongMessage长讯息?、textPersonName人名、textPostalAddress地址、textPassword密码、textVisiblePassword可见密码、textWebEditText做为网页表单的文本、textFilte文本筛选过滤、textPhonetic拼音输入、numberSigned有符号数字格式、numberDecimal可带小数点的浮点格式、phone电话号码、datetime时间日期、date日期、time时间。部分参考这里

android:marqueeRepeatLimit

在ellipsize指定marquee的状况下,设置重复滚动的次数,当设置为marquee_forever时表示无限次。

android:ems

设置TextView的宽度为N个字符的宽度。参见TextView中此属性的截图。

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:linksClickable

设置连接是否点击链接,即便设置了autoLink。

android:lineSpacingExtra

设置行间距。

android:lineSpacingMultiplier

设置行间距的倍数。如”1.2”

android:numeric

若是被设置,该TextView有一个数字输入法。有以下值设置:integer正整数、signed带符号整数、decimal带小数点浮点数。

android:password

以小点”.”显示文本

android:phoneNumber

设置为电话号码的输入方式。

android:privateImeOptions

提供额外的输入法选项(字符串格式)。依据输入法而决定是否提供,如这里所见。自定义输入法继承

InputMethodService。这篇文章也许有帮助。

android:scrollHorizontally

设置文本超出TextView的宽度的状况下,是否出现横拉条。

android:selectAllOnFocus

若是文本是可选择的,让他获取焦点而不是将光标移动为文本的开始位置或者末尾位置。TextView中设置后无效果。

android:shadowColor

指定文本阴影的颜色,须要与shadowRadius一块儿使用。参见TextView中此属性的截图。

android:shadowDx

设置阴影横向坐标开始位置。

android:shadowDy

设置阴影纵向坐标开始位置。

android:shadowRadius

设置阴影的半径。设置为0.1就变成字体的颜色了,通常设置为3.0的效果比较好。

android:singleLine

设置单行显示。若是和layout_width一块儿使用,当文本不能所有显示时,后面用“…”来表示。如android:text="test_ singleLine " android:singleLine="true" android:layout_width="20dp"将只显示“t…”。若是不设置singleLine或者设置为false,文本将自动换行

android:text

设置显示文本.

android:textAppearance

设置文字外观。如“?android:attr/textAppearanceLargeInverse

”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,不然使用默认的外观。可设置的值以下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse

android:textColor

设置文本颜色

android:textColorHighlight

被选中文字的底色,默认为蓝色

android:textColorHint

设置提示信息文字的颜色,默认为灰色。与hint一块儿使用。

android:textColorLink

文字连接的颜色.

android:textScaleX

设置文字缩放,默认为1.0f。参见TextView的截图。

android:textSize

设置文字大小,推荐度量单位”sp”,如”15sp”

android:textStyle

设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 能够设置一个或多个,用“|”隔开

android:typeface

设置文本字体,必须是如下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3]

android:height

设置文本区域的高度,支持度量单位:px(像素)/dp/sp/in/mm(毫米)

android:maxHeight

设置文本区域的最大高度

android:minHeight

设置文本区域的最小高度

android:width

设置文本区域的宽度,支持度量单位:px(像素)/dp/sp/in/mm(毫米),与layout_width的区别看这里

android:maxWidth

设置文本区域的最大宽度

android:minWidth

设置文本区域的最小宽度

 

2.4 EditText的使用 

EditText和TextView同样,既能够在Xml中声明实现,也能够在代码中动态的生成,关于在代码动态生成和TextView的相似,这里就不在赘述。下面以一个实例来讲明EditText的简单使用:

 XML布局中:

<TextView android:text="TextView" android:id="@+id/textView1"

      android:layout_height="wrap_content" android:layout_width="fill_parent"></TextView>

 

 <!-- 用于输入数字的文本框 -->

   <EditText android:id="@+id/editText1" android:inputType="date"

      android:layout_width="fill_parent" android:layout_height="wrap_content"

      android:maxLength="40" android:hint="输入电话号码" android:textColorHint="#FF000000"

      android:phoneNumber="true" android:imeOptions="actionGo"></EditText>

 

   <!-- 用于输入密码的文本框 -->

   <EditText android:id="@+id/editText2" android:inputType="date"

      android:layout_width="fill_parent" android:layout_height="wrap_content"

      android:maxLength="40" android:hint="输入密码" android:textColorHint="#FF000000"

      android:password="true" android:imeOptions="actionSearch"></EditText>

 

/rec/values/string.xml中:

string  name="RadioButton1">Windows</string >

    <string  name="RadioButton2">Linux</string >

    <string  name="RadioButton3">Mocos</string >

    <string  name="RadioButton4">Java</string >

 

Activity中让editText显示在屏幕上并实现监听:

/**

         * 得到TextView对象

         * 得到两个EditTextView对象

         */

        textview = (TextView)findViewById(R.id.textView1);

        edittext_num = (EditText)findViewById(R.id.editText1);

        edittext_pass= (EditText)findViewById(R.id.editText2);

        /**

         * 对EditText进行监听

         * 得到编辑框里面的内容并显示

         */

        edittext_num.addTextChangedListener(new TextWatcher() {

       

        @Override

        public void onTextChanged(CharSequence s, int start, int before, int count) {

          

           //if(!(textview.getText().toString()==null))

              textview.setText("edittext_num:"+edittext_num.getText().toString());

        }

       

        @Override

        public void beforeTextChanged(CharSequence s, int start, int count,

              int after) {

           // TODO Auto-generated method stub

          

        }

       

        public void afterTextChanged(Editable s) {

           // TODO Auto-generated method stub

          

        }

      });

          

        edittext_pass.addTextChangedListener(new TextWatcher() {

       

        @Override

        public void onTextChanged(CharSequence s, int start, int before, int count) {

          

           //if(!(textview.getText().toString()==null))

              textview.setText("你正在编辑edittext_pass");

        }

        public void beforeTextChanged(CharSequence s, int start, int count,

              int after) {

           // TODO Auto-generated method stub

        }

          

        public void afterTextChanged(Editable s) {

           // TODO Auto-generated method stub

        }

      });

}

示例的效果图以下:

 

 

3 Button按钮

3.1Button类的结构

Button类的层次关系以下:

java.lang.Object

    ↳ android.view.View

        ↳ android.widget.TextView

             ↳android.widget.Button

 

直接子类:

     CompoundButton

         

间接子类:

CheckBox, RadioButton, ToggleButton

 

3.2 Button类的方法

方法

功能描述

返回值

Button

Button类的构造方法

Null

onKeyDown

当用户按键时,该方法调用

Boolean

onKeyUp

当用户按键弹起后,该方法被调用

Boolean

onKeyLongPress

当用户保持按键时,该方法被调用

Boolean

onKeyMultiple

当用户屡次调用时,该方法被调用

Boolean

invalidateDrawable

刷新Drawable对象

void

scheduleDrawable

定义动画方案的下一帧

void

unscheduleDrawable

取消scheduleDrawable定义的动画方案

void

onPreDraw

设置视图显示,列如在视图显示以前调整滚动轴的边界

Boolean

sendAccessibilityEvent

发送事件类型指定的AccessibilityEvent。发送请求以前,须要检查Accessibility是否打开

void

sendAccessibilityEventUnchecked

发送事件类型指定的AccessibilityEvent。发送请求以前,不须要检查Accessibility是否打开

void

setOnKeyListener

设置按键监听

void

 

3.3 Button标签的属性

因为Button是继承TextView,因此TextView有的属性,它都能用。

属性

描述

android:layout_height

设置控件高度。可选值:fill_parent,warp_content,px

android:layout_width

设置控件宽度,可选值:fill_parent,warp_content,px

android:text

设置控件名称,能够是任意字符

android:layout_gravity

设置控件在布局中的位置,可选项:top,left,bottom,right,center_vertical,fill_vertica,fill_horizonal,center,fill等

android:layout_weight

设置控件在布局中的比重,可选值:任意的数字

android:textColor

设置文字的颜色

android:bufferType

设置取得的文本类别,normal、spannable、editable

android:hint

设置文本为空是所显示的字符

android:textColorHighlight

设置文本被选中时,高亮显示的颜色

android:inputType

设置文本的类型,none,text,textWords等

 

3.4 Button的使用

Button能够在xml中声明,也能够在代码中动态建立。

在xml中:

<Button android:orientation="vertical" 

       android:layout_height="wrap_content"  android:id="@+id/button1"

       android:layout_width="wrap_content"

       android:textColor="#0000FF"

       android:text="这是button1,能够点击" />

       <Button android:orientation="vertical" 

       android:layout_height="wrap_content"  android:id="@+id/button2"

       android:layout_width="wrap_content"

       android:textColor="#CD0000"

       android:text="这是button2,能够点击" />

       <Button android:orientation="vertical" 

       android:layout_height="wrap_content"  android:id="@+id/button3"

       android:layout_width="wrap_content"

      android:textColor="#000000"

       android:text="这是button3,能够点击" />

 

 

在代码中建立Button:

button4 = new Button(this);

        button4.setId(100);

        button4.setText("动态建立的Button");

        button4.setTextColor(Color.GREEN);

 

建立好了Button后,咱们就能够对其进行监听了,其中有两种方式:

一种是继承OnClickListenner接口:

public class ButtonActivity extends Activity implements OnClickListener{

button1 = (Button)findViewById(R.id.button1);

button1.setOnClickListener(this);

public void onClick(View v) {

  switch(v.getId()){

      case R.id.button1:

       .........

      break;

}

}

}

另外一种方式是:

public class ButtonActivity extends Activity{

  button1 = (Button)findViewById(R.id.button1);

button1.setOnClickListener(new Button.OnClickListener(){

 

      public void onClick(View v) {

        // TODO Auto-generated method stub

        ..........

      }

         

       });

 

 

 

 

效果图:

 

 

4 ImageButton图片按钮

4.1 ImageButton类的结构

ImageButton是带有图标的按钮,它的类层次关系以下:

java.lang.Object

android.view.View

android.widget.ImageView

android.widget.ImageButton

4.1 ImageButton类经常使用的方法

方法

功能描述

返回值

ImageButton

构造函数

null

setAdjustViewBounds

设置是否保持高宽比,须要与maxWidth和maxHeight结合起来一块儿使用

Boolean

getDrawable

获取Drawable对象,获取成功返回Drawable,不然返回null

Drawable

getScaleType

获取视图的填充方式

ScaleType

setScaleType

设置视图的填充方式,包括矩阵、拉伸等七种填充方式

void

setAlpha

设置图片的透明度

void

setMaxHeight

设置按钮的最大高度

void

setMaxWidth

设置按钮的最大宽度

void

setImageURI

设置图片的地址

void

setImageResource

设置图片资源库

void

setOnTouchListener

设置事件的监听

Boolean

setColorFilter

设置颜色过滤

void

 

4.2 ImageButton标签的经常使用属性

 

属性

描述

android:adjustViewBounds

设置是否保持宽高比,true或false

android:cropToPadding

是否截取指定区域用空白代替。单独设置无效果,须要与scrollY一块儿使用。True或者false

android:maxHeight

设置图片按钮的最大高度

android:maxWidth

设置图片的最大宽度

android:scaleType

设置图片的填充方式

android:src

设置图片按钮的drawable

android:tint

设置图片为渲染颜色

 

4.3ImageButton的使用

两种实现方式,在xml和代码中均可以实现,但相比较而言,在xml中实现更有利于代码的改动:

 在xml中声明 :

<ImageButton

 android:id="@+id/button1"

 android:layout_width="wrap_content"

 android:layout_height="wrap_content"

 android:src="@drawable/p1" //使用本身的图片

/>

<ImageButton

 android:id="@+id/button2"

 android:layout_width="wrap_content"

 android:layout_height="wrap_content"

 android:src="@android:drawable/sym_call_incoming " //使用系统自带的图片

/>

 

在代码中建立

magebutton3 =  new ImageButton(this);

        imagebutton3.setId(100);

        //设置本身的图片

  imagebutton3.setBackgroundDrawable(getResources().getDrawable(R.drawable.p2));

 

接下来就能够对imagebutton进行监听,咱们这里是在经过继承OnClickListener接口来实现的:

 

    imagebutton1 = (ImageButton)findViewById(R.id.button1);

        imagebutton2 = (ImageButton)findViewById(R.id.button2);

        //注册监听

        imagebutton1.setOnClickListener(this);

        imagebutton2.setOnClickListener(this);

       /注册监听

        imagebutton3.setOnClickListener(this);

        //加入布局

        layout = new LinearLayout(this);

        layout.addView(imagebutton3,param);

        linnearlayout.addView(layout,param);

public void onClick(View v) {

       // TODO Auto-generated method stub

       switch(v.getId()){

       case R.id.button1:

           textveiw.setText("你刚才点击的是ImageButton1");

           break;

       case R.id.button2:

           textveiw.setText("你刚才点击的是ImageButton2");

           break;

       case 100:

          

           textveiw.setText("你刚才点击的是ImageButton3");

           if(s){

       imagebutton3.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.stat_sys_vp_phone_call_on_hold));

            s=false;

            break;

           }

          

           imagebutton3.setBackgroundDrawable(getResources().getDrawable(R.drawable.p2));

           s = true;

          break;

      

       }

    }

效果以下:

 

5 CheckBox多项选择

5.1 CheckBox类的层次关系

多项选择CheckBox组件也被称为复选框,该组件经常使用于某选项的打开或者关闭。它的层次关系以下:

java.lang.Object

android.view.View

  android.widget.TextView

    android.widget.Button

      android.widget.CompoundButton

        android.widget.CheckBox

 

5.2 CheckBox经常使用的方法

方法

功能描述

返回值

dispatchPopulateAccessibilityEvent

在子视图建立时,分派一个辅助事件

boolean(true:完成辅助事件分发 false:没有完成辅助事件分发)

isChecked

判断组件状态是否勾选

boolean(true:被勾选,false:未被勾选)

onRestoreInstanceState

设置视图恢复之前的状态

void

performClick

执行click动做,该动做会触发事件监听器

boolean(true:调用事件监听器,false:没有调用事件监听器)

setButtonDrawable

根据Drawable对象设置组件的背景

void

setChecked

设置组件的状态

void

setOnCheckedChangeListener

设置事件监听器

void

tooggle

改变按钮当前的状态

void

onCreateDrawableState

获取文本框为空时,文本框里面的内容

CharSequence

onCreateDrawableState

为当前视图生成新的Drawable状态

int[]

 

5.3 CheckBox的使用

 下面是一个使用ChekBox的实例:

XML中声明定义4CheckBox

<TextView 

  android:id="@+id/TextView1"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/hello"

    />

<CheckBox

  android:id="@+id/CheckBox1"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:text="@string/CheckBox1"

</CheckBox>

<CheckBox

  android:id="@+id/CheckBox2"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:text="@string/CheckBox2"

</CheckBox>

<CheckBox

android:id="@+id/CheckBox3"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/CheckBox3"

</CheckBox>

<CheckBox

android:id="@+id/CheckBox4"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/CheckBox4"

</CheckBox>

    <Button

      android:id="@+id/button1"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:text="提交"

    >

</Button>

 

/rec/values/string.xml中定义四个选项:

<string name="CheckBox1">篮球</string>

     <string name="CheckBox2">足球</string>

     <string name="CheckBox3">乒乓球</string>

 <string name="CheckBox4">排球</string>

 

而后在Activity中就可使用并监听CheckBox了:

 

//用来显示题目

   TextView m_TextView1;

   //“提交按钮”

   Button     m_Button1;

   //4个多选项

   CheckBox m_CheckBox1;

   CheckBox m_CheckBox2;

   CheckBox m_CheckBox3;

   CheckBox m_CheckBox4;

  

   /** Called when the activity is first created. */

   @Override

   public void onCreate(Bundle savedInstanceState)

   {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);

 

      m_TextView1 = (TextView) findViewById(R.id.TextView1);

      m_Button1 = (Button) findViewById(R.id.button1);

 

      /* 取得每一个CheckBox对象 */

      m_CheckBox1 = (CheckBox) findViewById(R.id.CheckBox1);

      m_CheckBox2 = (CheckBox) findViewById(R.id.CheckBox2);

      m_CheckBox3 = (CheckBox) findViewById(R.id.CheckBox3);

      m_CheckBox4 = (CheckBox) findViewById(R.id.CheckBox4);

 

      //对每一个选项设置事件监听

      m_CheckBox1.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {

        @Override

        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)

        {

           if(m_CheckBox1.isChecked())

           {

              DisplayToast("你选择了:"+m_CheckBox1.getText());

           }

        }

      });

      ////////////////////

      m_CheckBox2.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {

        @Override

        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)

        {

           if(m_CheckBox2.isChecked())

           {

              DisplayToast("你选择了:"+m_CheckBox2.getText());

           }

        }

      });

      /////////////////

      m_CheckBox3.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {

        @Override

        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)

        {

           if(m_CheckBox3.isChecked())

           {

              DisplayToast("你选择了:"+m_CheckBox3.getText());

           }

        }

      });

      ////////////////

      m_CheckBox4.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {

        @Override

        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)

        {

           if(m_CheckBox4.isChecked())

           {

              DisplayToast("你选择了:"+m_CheckBox4.getText());

           }

        }

      });

      //对按钮设置事件监听

      m_Button1.setOnClickListener(new Button.OnClickListener() {

        public void onClick(View v)

        {

           int num = 0;

           if(m_CheckBox1.isChecked())

           {

              num++;

           }

           if(m_CheckBox2.isChecked())

           {

              num++;

           }

           if(m_CheckBox3.isChecked())

           {

              num++;

           }

           if(m_CheckBox4.isChecked())

           {

              num++;

           }

           DisplayToast("谢谢参与!你一共选择了"+num+"项!");

        }

      });

   }

  

   /* 显示Toast  */

   public void DisplayToast(String str)

   {

      Toast toast = Toast.makeText(this, str, Toast.LENGTH_SHORT);

      //设置toast显示的位置

      toast.setGravity(Gravity.TOP, 0, 220);

      //显示该Toast

      toast.show();

   }

该实例的运行效果图以下所示;

 

 

6 RadioGroup、RadioButton单项选择

6.1类的层次关系

RadioButton指的是一个单选按钮,它有选中和不选中两种状态,而RadioGroup组件也被称为单项按钮组,它能够有多个RadioButton。一个单选按钮组只能够勾选一个按钮,当选择一个按钮时,会取消按钮组中其余已经勾选的按钮的选中状态。

RadioButton的类层次关系以下:

java.lang.Object

android.view.View

       android.widget.TextView

android.widget.Button

android.widget.CompoundButton

android.widget.RadioButton

 

而RadioGroup类的层次关系以下:

java.lang.Object

   android.view.View

     android.view.ViewGroup

        android.widget.LinearLayout                   android.widget.RadioGroup

 

6.2经常使用的方法

RadioButton使用到的公共方法:

public void toggle ()

         //将单选按钮更改成与当前选中状态相反的状态。

         //若是这个单选按钮已经选中,这个方法将不切换单选按钮。

 该方法的源码以下:

 

 

 

RadioGroup中使用到的公共方法:

 

(1)public void addView (View child, int index, ViewGroup.LayoutParams params)

 功能:使用指定的布局参数添加一个子视图

参数:child     所要添加的子视图

index     将要添加子视图的位置

params     所要添加的子视图的布局参数

                           

 

(2)public void check (int id) 

   若是传递-1做为指定的选择标识符来清除单选按钮组的勾选状态,至关于调用clearCheck()操做

参数:id  该组中所要勾选的单选按钮的惟一标识符(id)

    参见 getCheckedRadioButtonId()   clearCheck()

                           

(3)public void clearCheck () 

功能:清除当前的选择状态,当选择状态被清除,则单选按钮组里面的全部单选按钮将取消勾选状态,getCheckedRadioButtonId()将返回null

  参见

     check(int)

     getCheckedRadioButtonId()

 

(4)public RadioGroup.LayoutParams generateLayoutParams (AttributeSet attrs)   

功能:基于提供的属性集合返回一个新的布局参数集合

参数: attrs 用于生成布局参数的属性

返回值:返回一个ViewGroup.LayoutParams或其子类的实例                       

                  

(5)public int getCheckedRadioButtonId ()  

功能:返回该单选按钮组中所选择的单选按钮的标识ID,若是没有勾选则返回-1

  返回值:返回该单选按钮组中所选择的单选按钮的标识ID                

                           

  参见

      check(int)                     

clearCheck()

 

(6)public void setOnCheckedChangeListener (RadioGroup.OnCheckedChangeListener listener)

功能:注册一个当该单选按钮组中的单选按钮勾选状态发生改变时所要调用的回调函数

参数:listener 当单选按钮勾选状态发生改变时所要调用的回调函数

                             

                           

(7)public void setOnHierarchyChangeListener (ViewGroup.OnHierarchyChangeListener listener)

功能:注册一个当子内容添加到该视图或者从该视图中移除时所要调用的回调函数

参数:listener    当层次结构发生改变时所要调用的回调函数

                           

 

RadioGroup中受保护的方法:

(1)protected LinearLayout.LayoutParams generateDefaultLayoutParams ()

功能:当布局为垂直方向时,将返回一个宽度为“填充父元素”(MATCH_PARENT),高度为“包裹内容”的布局参数集合,若是为水平方向时,将返回宽度为“包裹内容”,高度为“填充父元素”的布局参数集合

(match_parent即为fill_parent,public static final int FILL_PARENT/MATCH_PARENT = -1 )

返回值:返回一个默认的布局参数集合

 

(2)protected void onFinishInflate ()

功能:当视图从XML中加载,且相应的子视图被添加以后,调用该方法,

即便子类重写了该方法,应该确保去调用父类的方法(一般放在方法在第一句),这样才能完成相应的调用参数

 返回值: 返回一个默认的布局参数集合 

              

6.3RadioButton和RadioGroup的综合使用

  XML布局中

  <RadioGroup

    android:id="@+id/RadioGroup01"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:orientation="vertical"

    android:layout_x="3px"

    android:layout_y="54px"

<!--      选项要在rec/values/string.xml中定义 -->

    <RadioButton

      android:id="@+id/RadioButton1"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:text="@string/RadioButton1"

    />

    <RadioButton

      android:id="@+id/RadioButton2"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:text="@string/RadioButton2"

    />

    <RadioButton

      android:id="@+id/RadioButton3"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:text="@string/RadioButton3"

    />

    <RadioButton

      android:id="@+id/RadioButton4"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:text="@string/RadioButton4"

    />

</RadioGroup>   

 

Avtivity中:

/**

        * 得到TextView对象

        * 得到RadioGroup对象

        * 得到4个RadioButton对象

        */

       m_TextView = (TextView) findViewById(R.id.TextView01);

       m_RadioGroup = (RadioGroup) findViewById(R.id.RadioGroup01);

       m_Radio1 = (RadioButton) findViewById(R.id.RadioButton1);

       m_Radio2 = (RadioButton) findViewById(R.id.RadioButton2);

       m_Radio3 = (RadioButton) findViewById(R.id.RadioButton3);

       m_Radio4 = (RadioButton) findViewById(R.id.RadioButton4);

 

       /* 设置事件监听  */

       m_RadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

           @Override

           public void onCheckedChanged(RadioGroup group, int checkedId)

           {

              // TODO Auto-generated method stub

              if (checkedId == m_Radio2.getId())

              {

                  DisplayToast("正确答案:" + m_Radio2.getText() + ",恭喜你,回答正确!");

              }

               else

              {

                  DisplayToast("请注意,回答错误!");

              }

           }

       });

    }

   

    /* 显示Toast  */

    public void DisplayToast(String str)

    {

       Toast toast = Toast.makeText(this, str, Toast.LENGTH_LONG);

       //设置toast显示的位置

       toast.setGravity(Gravity.TOP, 0, 220);

       //显示该Toast

       toast.show();

    }

示例的效果图以下:

 

 

 

 

7 Toast提示

7.1 Toast类的结构

Toast是Android提供的“快显讯息”类,它的用途不少,使用起来很是的简单。它是直接继承java.lang.Object的。所以它的类层次结构以下:

 

java.lang.Object

android.widget.Toast

7.2 Toast的常量

Toast中有两个关于Toast显示时间长短的常量:

常量

         int   LENGTH_LONG      

持续显示视图或文本提示较长时间。该时间长度可定制。

         参见

                   setDuration(int)

 

int   LENGTH_SHORT

持续显示视图或文本提示较短期。该时间长度可定制。该值为默认值。

         参见

                   setDuration(int)

7.3 Toast类的方法

 (1)public int cancel ()

若是视图已经显示则将其关闭,尚未显示则再也不显示。通常不须要调用该方法。正常状况下,视图会在超过存续期间后消失。

 

(2)public int getDuration ()

返回存续期间

 请参阅setDuration(int)

             

(3)public int getGravity ()

 取得提示信息在屏幕上显示的位置。      

 请参阅  Gravity setGravity()

                         

 (4)public float getHorizontalMargin ()

返回横向栏外空白。

 

(5)public float getVerticalMargin ()

返回纵向栏外空白。

 

(6)public View getView ()

返回 View 对象。

请参阅setView(View)

 

 (7)public int getXOffset ()

返回相对于参照位置的横向偏移像素量。

Toast msg = Toast.makeText(Main.this, "Message", Toast.LENGTH_LONG);

msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);

msg.show();              

 

(8)public int getYOffset ()

返回相对于参照位置的纵向偏移像素量。

 

(9)public static Toast makeText (Context context, int resId, int duration)

生成一个从资源中取得的包含文本视图的标准 Toast 对象。

参数:

  context 使用的上下文。一般是你的 ApplicationActivity 对象。

  resId  要使用的字符串资源ID,能够是已格式化文本。       

  duration 该信息的存续期间。值为 LENGTH_SHORTLENGTH_LONG    

异常:

当资源未找到时抛异常Resources.NotFoundException

 

(10)public static Toast makeText (Context context, CharSequence text, int duration)

生成一个包含文本视图的标准 Toast 对象。

参数:

context

使用的上下文。一般是你的 ApplicationActivity 对象。

resId

要显示的文本,能够是已格式化文本。

duration

该信息的存续期间。值为 LENGTH_SHORTLENGTH_LONG

 

 

(11)public void setDuration (int duration)

设置存续期间。

请参阅

LENGTH_SHORT

LENGTH_LONG

 

(12)public void setGravity (int gravity, int xOffset, int yOffset)

设置提示信息在屏幕上的显示位置。

(自定义Toast的显示位置,toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0)能够把Toast定位在左上角。Toast提示的位置xOffset:大于0向右移,小于0向左移

请参阅

Gravity

getGravity()

 

(13)public void setMargin (float horizontalMargin, float verticalMargin)

设置视图的栏外空白。

参数:

horizontalMargin  容器的边缘与提示信息的横向空白(与容器宽度的比)。

verticalMargin   容器的边缘与提示信息的纵向空白(与容器高度的比)。

 

(14)public void setText (int resId)

更新以前经过 makeText() 方法生成的 Toast 对象的文本内容。

参数: resId      为 Toast 指定的新的字符串资源ID。

 

 (15)public void setText (CharSequence s)

更新以前经过 makeText() 方法生成的 Toast 对象的文本内容。

参数s   为 Toast 指定的新的文本

 

(16)public void setView (View view)

设置要显示的 View 。

(注意这个方法能够显示自定义的toast视图,能够包含图像,文字等等。是比较经常使用的方法。)

请参阅

getView()

 

(17)public void show ()

按照指定的存续期间显示提示信息。

 

7.4 Toast的使用实例

咱们接下来的示例要实现的是Toast的直接显示以及toast显示view的内容:

 首先咱们在XML布局中声明了两个Button按钮:

<Button android:id="@+id/button1"

   android:layout_width="fill_parent"

   android:layout_height="wrap_content"

   android:text="Toast显示View"

/>

<Button android:id="@+id/button2"

   android:layout_width="fill_parent"

   android:layout_height="wrap_content"

   android:text="Toast直接输出"

/>

而后在Activity中:

Button button1=(Button)findViewById(R.id.button1);

        button1.setOnClickListener(bt1lis);

        Button button2=(Button)findViewById(R.id.button2);

        button2.setOnClickListener(bt2lis);

    }

    OnClickListener bt1lis=new OnClickListener(){

 

      public void onClick(View v) {

        showToast();

      }

    };

    OnClickListener bt2lis=new OnClickListener(){

      public void onClick(View v) {

        Toast.makeText(Z_Toast1Activity.this,"直接输出测试", Toast.LENGTH_LONG).show();

      }

    };

    public void showToast(){

      LayoutInflater li=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

      View view=li.inflate(R.layout.toast,null);

      //把布局文件toast.xml转换成一个view

      Toast toast=new Toast(this);

      toast.setView(view);

      //载入view,即显示toast.xml的内容

      TextView tv=(TextView)view.findViewById(R.id.tv1);

      tv.setText("Toast显示View内容");

      //修改TextView里的内容

      toast.setDuration(Toast.LENGTH_SHORT);

      //设置显示时间,长时间Toast.LENGTH_LONG,短期为Toast.LENGTH_SHORT,不能够本身编辑

      toast.show();

    }

  咱们实现的效果图以下:

 

 

8 Spinner下拉列表

8.1 Spinner类的层次关系

Spinner功能相似RadioGroup,相比RadioGroup,Spinner提供了体验性更强的UI设计模式。一个Spinner对象包含多个子项,每一个子项只有两种状态,选择或未被选中。Spinner类的层次关系以下:

java.lang.Object

android.view.View

  android.view.ViewGroup

    android.widget.AdapterView<T extends android.widget.Adapter>

          android.widget.AbsSpinner

             android.widget.Spinner

8.2 Spinner类的主要方法

(1)public int getBaseline()

返回这个控件文本基线的偏移量。若是这个控件不支持基线对齐,那么方法返回-1.

返回值:返回控件基线左边边界位置,不支持时返回-1

            (这个类不知道干什么用,只找到下面的代码

 

(2)public CharSequence getPrompt()

返回值:    当对话框弹出的时候显示的提示(即:得到弹出视图上的标题字)

 

 (3)public void onClick(DialogInterface dialog, int which)

当点击弹出框中的项时这个方法将被调用。

参数:dialog       点击弹出的对话框

which      点击按钮(如:Button)或者点击位置

 

 (4)public Boolean performClick()

若是它被定义就调用此视图的OnClickListener(译者注:例如能够在加载时默认弹出下拉列表)。

 返回值  :    为True一个指定的OnClickListener被调用,为false时不被调用。

 

(5)public void setOnItemClickListener(AdapterView.OnItemClickListener  I)

        Spinner不支持item的点击事件,调用此方法将引起异常。

参数:l    这个监听将被忽略

      

(6)public void setPromptId(CharSequence prompt)

设置对话框弹出的时候显示的提示(译者注:设置弹出视图上的标题字)

参数

prompt     设置的提示

 

(7)public void setPromptId(int promptId)

设置对话框弹出的时候显示的提示(译者注:设置弹出视图上的标题字)

参数:prompted 当对话框显示是显示这个资源id所表明的提示。

 

 受保护的方法

(8)protected void onDetachedFromWindow ()

当这个视图从屏幕上卸载时候被调用。在这一点上再也不绘制视图。

 

(9)protected void onLayout(boolean changed, int l, int t, int r, int b)

当View要为全部子对象分配大小和位置时,调用此方法。派生类与子项们应该重载这个方法和调用布局每个子项。

 参数:changed   这是这个视图的一个新的大小或位置

l        相对父空间的左位置

t        相对父空间的顶端位置

r        相对父空间的右端位置

b       相对父空间的底部位置

 

参见

Creates and positions all views

 

8.3 Spinner类的属性

XML属性

属性名称

描述

android:prompt

该提示在下拉列表对话框显示时显示。(也就是对话框的标题:

 

 

 

8.4 Spinner的使用示例

首先咱们在Xml中声明Spinner,这里同时声明了一个TextView方便等下显示Spinner的监听结果:

<TextView  android:id="@+id/TextView01"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:text="@string/hello"/>

<Spinner android:id="@+id/Spinner01"

   android:layout_width="300dip"

   android:layout_height="wrap_content">

</Spinner>

 

而后就能够在Activity中使用了:

final TextView textview = (TextView)findViewById(R.id.TextView01);

        Spinner spinner = (Spinner) findViewById(R.id.Spinner01);  

        final List<String> list  = new ArrayList<String>();

        list .add("Spinner子项1");

        list .add("Spinner子项2");

        list .add("Spinner子项3");

        //将可选内容list与ArrayAdapter相链接

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list );

        //设置下拉列表的风格

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

       //将Adapter添加到Spinner

        spinner.setAdapter(adapter);

 

好了,到这步以及在屏幕上能够显示出Spinner了,接下来就是添加事件监听了

        //添加事件监听

spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){

        @Override

        public void onItemSelected(AdapterView<?> arg0, View arg1,

              int arg2, long arg3) {

           // TODO Auto-generated method stub

           textview.setText("你当前选择的是: "+list.get(arg2));

        }

        @Override

        public void onNothingSelected(AdapterView<?> arg0) {

           // TODO Auto-generated method stub

          

        }

                  });

示例的使用效果图以下:

 

 

9 ListView列表

9.1 ListView类的层次关系

ListView是用来显示一个列表的控件,如下是ListView类的层次关系:

java.lang.Object

   android.view.View     

     android.view.ViewGroup             

        android.widget.AdapterView<T extends android.widget.Adapter>                       android.widget.AbsListView                           android.widget.ListView

直接子类

         ExpandableListView (使用竖滚动条查看的两级列表视图)

 

9.2 ListView的全部方法

公共方法

        (1)public void addFooterView (View v)

         加一个固定显示于list底部的视图。若是此方法被调用超过一次,所加的几个视图将按照它们加入的顺序排列。加入的视图可取得焦点。

         注意:在调用setAdapter以前调用此方法。这样的话,能够利用点击光标来收起有header view和footer view的ListView。

参数:v      要加的视图

                           

(2)public void addFooterView (View v, Object data, boolean isSelectable)

         加一个固定显示于list底部的视图。若是此方法被调用超过一次,所加的几个视图将按照它们加入的顺序排列。加入的视图可取得焦点。

         注意:在调用setAdapter以前调用此方法。这样的话,能够利用点击光标来收起有header view和footer view的ListView。

参数:v                         要加的视图

                     data                   和此视图关联的数据     

     isSelectable      设为true则表示footer view能够被选中                     

                           

(3)public void addHeaderView (View v)

         加一个固定显示于list顶部的视图。若是此方法被调用超过一次,所加的几个视图将按照它们加入的顺序排列。加入的视图可取得焦点。

         注意:在调用setAdapter以前调用此方法。这样的话,能够利用点击光标来收起有header view和footer view的ListView。

    参数:v      要加的视图

                           

(4)public void addHeaderView (View v, Object data, boolean isSelectable)

         加一个固定显示于list顶部的视图。若是此方法被调用超过一次,所加的几个视图将按照它们加入的顺序排列。加入的视图可取得焦点。

         注意:在调用setAdapter以前调用此方法。这样的话,能够利用点击光标来收起有header view和footer view的ListView。

    参数:v                         要加的视图

                     data                   和此视图关联的数据    

                     isSelectable      表示此header view可选与否   

                           

(5)public void clearChoices ()

         取消以前设置的任何选择

 

(6)public boolean dispatchKeyEvent (KeyEvent event)

         按照能够得到焦点的顺序(从视图树的顶端到当前得到焦点的视图),分派一个按键事件给下一个视图。若此视图有焦点,事件将会分派给它本身。不然它将按照顺序,分派给下一个节点。此方法同时触动全部按键监听器。

         参数:event                 被分派的事件

         返回:若事件被处理,则返回true;不然为false

                  

(7)public boolean dispatchPopulateAccessibilityEvent (AccessibilityEvent event)

         在视图的子项目被构建时,分派一个辅助事件。

                  参数:event                 事件

                  返回:若事件所有完成,则返回true

                           

(8)public ListAdapter getAdapter ()

         返回ListView当前用的适配器。返回的适配器不能够和传给setAdapter(ListAdapter)的参数同样,可是能够是WrapperListAdapter。

                  返回:当前用来显示ListView中数据的适配器

                  参见:setAdapter(ListAdapter)

                           

(9)public long[] getCheckItemIds ()

此方法已通过时了。使用getCheckedItemIds()代替。

         返回被选中项目的索引集合。只有当选择模式没有被设置为CHOICE_MODE_NONE时才有效。

 

(10)public long[] getCheckedItemIds ()

         返回被选中项目的索引集合。只有当选择模式没有被设置为CHOICE_MODE_NONE,而且适配器有稳定的 ID(hasStableIds()==true) 时,结果才有效。

         返回

                   一个新的数组,包含列表中每一个被选中的索引(id)

 

(11)public int getCheckedItemPosition ()

         返回当前被选中的项目。只有当选择模式已被设置为CHOICE_MODE_SINGLE时 ,结果才有效。

                  返回:

                            返回当前被选中的项目的索引;若没有项目被选中,则返回INVALID_POSITION

                  参见

                            setChoiceMode(int)

 

(12)public SparseBooleanArray getCheckedItemPositions ()

         返回当前被选中的项目集合。只有当选择模式没有被设置为CHOICE_MODE_NONE时 ,结果才有效。

                  返回

                            类型为SparseBooleanArray的值,其中,对每个索引所表明的项目,若被选中,则返回true;当选择模式被设置为CHOICE_MODE_NONE时 ,返回null。

 

(13)public int getChoiceMode ()

                  返回

                            返回当前的选择模式

                  参见

                            setChoiceMode(int)

 

(14)public Drawable getDivider ()

                  返回

                            返回当前画在列表元素之间,做为分隔符的图形

 

(15)public int getDividerHeight ()

                  返回

                            返回分隔符的高度

 

(16)public int getFooterViewsCount ()

                  返回

                            列表中的页脚视图数量;缺省实现时,数量为0

 

(17)public int getHeaderViewsCount ()

                  返回

                            列表中的页眉视图数量;缺省实现时,数量为0

 

(18)public boolean getItemsCanFocus ()

                  返回

                            ListAdapter所生成的视图是否能够包含能取得焦点的项目

 

(19)public int getMaxScrollAmount ()

         返回

                   The maximum amount a list view will scroll in response to an arrow event.

                   响应箭头事件时,列表视图能够滚动的最大值。(译者注:此处翻译待改进,恐怕须要仔细查看源代码才能明白其含义,也能够用Google Code搜索相关的代码)

 

(20)public boolean isItemChecked (int position)

         对于由position指定的项目,返回其是否被选中。只有当选择模式已被设置为CHOICE_MODE_SINGLE或CHOICE_MODE_MULTIPLE时 ,结果才有效。

                  参数

                            position                      要返回选中状态的项目

                  返回

                            返回项目的选中状态;若选择模式无效,则返回false

 

(21)public boolean onKeyDown (int keyCode, KeyEvent event)

         KeyEvent.Callback.onKeyMultiple()的缺省实现:若视图被激活而且能够被点击,当出现KEYCODE_DPAD_CENTER和KEYCODE_ENTER表明的行为时,作点击该视图的动做。

                  参数

                            keyCode                     表示按某个按键的按键代号,参见KeyEvent

                            event                           定义按键动做的按键事件对象

                  返回

                            若事件被成功处理,则返回true;若想要下一个接收器处理该事件,则返回false

 

(22)public boolean onKeyMultiple (int keyCode, int repeatCount, KeyEvent event)

         KeyEvent.Callback.onKeyMultiple()的缺省实现:老是返回false(不处理该事件)。

                  参数

                            keyCode                     表示按某个按键的按键代号,参见KeyEvent

                            repeatedCount         实现动做的次数

                            event                           定义按键动做的按键事件对象

                  返回

                            若事件被成功处理,则返回true;若想要下一个接收器处理该事件,则返回false

 

(23)public boolean onKeyUp (int keyCode, KeyEvent event)

         KeyEvent.Callback.onKeyMultiple()的缺省实现:当出现KEYCODE_DPAD_CENTER和KEYCODE_ENTER表明的行为时,作点击该视图的动做。

                  参数

                            keyCode                     表示按某个按键的按键代号,参见KeyEvent

                            event                           定义按键动做的按键事件对象

                  返回

                            若事件被成功处理,则返回true;若想要下一个接收器处理该事件,则返回false

 

(24)public void onRestoreInstanceState (Parcelable state)

         从新建立并显示一个视图,此视图拥有以前onSaveInstanceState()保存的内部状态。当state为null时,此方法不会被调用。

                  参数

                            state                           以前onSaveInstanceState()保存的状态

 

(25)public Parcelable onSaveInstanceState ()

         保存视图的内部状态,用于之后建立新的拥有一样状态的实例。可保存的状态只包含非持久性的,或者可从新组建的信息。好比,永远不可能保存你当前在屏幕上的位置,由于当新的实例被放置于视图层次体系中时,位置会被从新计算。

         一些能够被保存的状态:文本视图(可是一般不是指文本自己,由于文本是被保存在内容提供商或其余持久性的储存体中)中当前的光标位置;列表视图中当前的选中项。

返回                  

返回一个包含视图当前动态状态的接口方法对象;若没有东西被保存,则返回null。缺省状况下返回null。

 

(26)public boolean onTouchEvent (MotionEvent ev)

         此方法用于处理触摸屏的动做事件。

                  参数

                            ev                        动做事件

                  返回

                            若事件被成功处理,则返回true;不然返回false

 

(27)public boolean performItemClick (View view, int position, long id)

         调用定义好的OnItemClickListener。

                  参数

                            view                   AdapterView中被点击到的视图

                            position             视图在适配器中的索引

                            id                         被点击到的项目的行id

                  返回

                            如有定义好的OnItemClickListener被成功调用,则返回true;不然返回false

 

(28)public boolean removeFooterView (View v)

         删除以前加入的某个页脚视图。

                  参数

                            v                 要删除的视图

                  返回

                            若视图被成功删除,则返回true;若此视图不是页脚视图,则返回false

 

(29)public boolean removeHeaderView (View v)

         删除以前加入的某个页眉视图。

                  参数

                            v                 要删除的视图

                  返回

                            若视图被成功删除,则返回true;若此视图不是页眉视图,则返回false             

(30)public boolean requestChildRectangleOnScreen (View child, Rect rect, boolean immediate)

         当组里的某个子项须要被定位在屏幕的某个矩形范围时,调用此方法。    

         重载此方法的ViewGroup可确认如下几点:

                   · 子项目将是组里的直系子项

                   · 矩形将在子项目的坐标体系中

         重载此方法的ViewGroup必须保证如下几点:

                   · 若矩形已是可见的,则没有东西会改变

                   · 为使矩形区域所有可见,视图将能够被滚动显示

                  参数

                            child                   发出请求的子项目

                            rect                    子项目坐标系内的矩形,即此子项目但愿在屏幕上的定位

                            immediate        设为true,则禁止动画和缓释移动滚动条

                  返回

                            这个可滚动显示的组,是否接受请求

 

(31)public void setAdapter (ListAdapter adapter)

         设置ListView背后的数据。根据ListView目前使用的特性,adapter可能被WrapperListAdapter收起。例如:加页眉和/或页脚会使adapter被收起。

                  参数

                            adapter             负责维护列表背后的数据,以及生成视图来显示数据里的项目

                  参见

                            getAdapter()            

 

(32)public void setCacheColorHint (int color)

         当color的值不为0时,此值表示的颜色将提示使用者,列表正在一片单色不透明的背景上被画出。

                  参数

                            color                   背景色

 

(33)public void setChoiceMode (int choiceMode)

         设置List的选择模式。缺省状况下,列表没有选择模式(即值为CHOICE_MODE_NONE)。

                  参数

                            choiceMode              值可为CHOICE_MODE_NONE,CHOICE_MODE_NONE和CHOICE_MODE_NONE中的一种

 

(34)public void setDivider (Drawable divider)

         设置将画在列表中每一个项目之间的图形。若是图形没有已设定好的高度,则必须同时调用setDividerHeight(int)。

                  参数

                            divider               将用做分隔符的图形

 

(35)public void setDividerHeight (int height)

         设置分隔符(画在列表中每一个项目之间)的高度。调用此方法将覆盖由setDivider(Drawable)设置的高度。

                  参数

                            height       分隔符的新高度,单位为像素

 

(36)public void setFooterDividersEnabled (boolean footerDividersEnabled)

         设置能够或者不能够为页脚视图画上分隔符。

                  参数

                            headerDividersEnabled            设为true,代表能够画;设为false则不能够

                  参见

                            setHeaderDividerEnabled(boolean)

                            addFooterView(android.view.View)

 

(37)public void setHeaderDividersEnabled (boolean headerDividersEnabled)

         设置能够或者不能够为页眉视图画上分隔符。

                  参数

                            headerDividersEnabled            设为true,代表能够画;设为false则不能够

                  参见

                            setFooterDividerEnabled(boolean)

                            addHeaderView(android.view.View)

 

(38)public void setItemChecked (int position, boolean value)

         设置position所指定项目的选择状态。只有选择模式为CHOICE_MODE_SINGLE或者CHOICE_MODE_MULTIPLE时,此设置才有效。

                  参数

                            position             须要改变选择状态的项目的索引

                            value                  新的选择状态

 

(39)public void setItemsCanFocus (boolean itemsCanFocus)

         代表在由ListAdapter建立的视图中,可包含能得到焦点的项目。

                  参数

                            itemsCanFocus         若项目能得到焦点,则设为true;不然为false

 

(40)public void setSelection (int position)

         选中position指定的项目。若为触摸模式,则指定项目不会被选中,但位置变化同样。若position的值小于0,则position为0的项目将被选中。

                  参数

                            position             须要选中的项目的索引(从0开始)

 

(41)public void setSelectionAfterHeaderView ()

         选中页眉视图下的第一个列表项目。

 

(42)public void setSelectionFromTop (int position, int y)

         选中position指定的项目,并将所选项置于距离ListView顶端y像素的位置(若为触摸模式,则指定项目不会被选中,但位置变化同样)。

                  参数

                            position             须要选中的项目的索引(从0开始)

                            y                       距离ListView(包括间隙)顶端的位置

 

受保护方法

        (43) protected boolean canAnimate ()

         表示此视图组是否能够在第一次被布局后,仍能够动态调整其子项。

                  返回

                            若能够则为true,不然为false

 

(44)protected void dispatchDraw (Canvas canvas)

         调用此方法来绘出子视图。可被衍生类重写,以便在其子项被画出以前取得控制权。

                  参数

                            canvas              绘出View所用的canvas(画布?)

 

(45)protected View findViewTraversal (int id)

                  参数

                            id                         要找的View的id

                  返回值

                            有此id的View,若没有找到则为null

 

(46)protected View findViewWithTagTraversal (Object tag)

                  参数

                            tag                    要找的View的标签

                  返回值

                            有此标签的View,若没有找到则为null

 

(47)protected void layoutChildren ()

         子类必须重写此方法来布局其子项。

        

(48)protected void onFinishInflate ()

         当View以及全部子项从XML中导入时被调用,是导入的最后一步。即便子类重写onFinishInflate,也必须保证有调用超方法,这样,方法才会被调用。

        

(49)protected void onFocusChanged (boolean gainFocus, int direction, Rect previouslyFocusedRect)

         当View的焦点改变时被调用。重写时,要确保超类的直接调用,这样取得焦点的方式才是标准的。

参数

                            gainFocus        若View有焦点,则为True;不然为False。

                            direction           当requestFocus()被调用时,方向焦点被移动。其值可为FOCUS_UP,FOCUS_DOWN,FOCUS_LEFT或FOCUS_RIGHT。在使用缺省条件的状况下,direction并不老是可用。

                            previouslyFocusedRect    以前获得焦点的View的坐标系统所构成的矩形。若是可用,这个将被当成精确信息(代表焦点从何而来以及从何方向而来)来传递;不然将传递null。

 

(50)protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

         View调用此方法来肯定自己和所包含内容的大小。此方法被measure(int,int)唤起,并且必须被子类重写以获得所包含内容的确切大小。

         注意:当重写此方法时,必须调用setMeasureDimension(int,int)来保存View的大小。若是没有作到,将会引起一个measure(int,int)抛出的IllegalStateException(非法状态错误)。超类onMeasure(int,int)能够被调用。

         编写基类的确认大小的方法,缺省状况下是根据其背景大小来确认,除非MeasureSepc容许有更大的高度或宽度。子类必须重写onMeasure(int,int)以获得对其内容大小的更准确的测量。

         若此方法被重写,它的子类须要确保其高度和宽度至少达到View所规定的最小值(可经过getSuggestedMinimumHeight()和getSuggestedMinimumWidth()获得)。

参数

                            widthMeaureSpec           受上一层大小影响下的对水平空间的要求。可参看View.MeasureSpec。

                            heightMeasureSpec         受上一层大小影响下的对垂直空间的要求。可参看View.MeasureSpec。

                           

protected void onSizeChanged (int w, int h, int oldw, int oldh)

         当VIew的大小改变时此方法被调用。若是VIew是刚刚被加入,则视以前的值为0。

参数

                            w                       View的当前宽度

                            h                          View的当前高度

                            oldw                   View大小改变以前的宽度

                            oldh                    View大小改变以前的高度

 

9.3 ListView的属性及包含的几个常量

XML属性

 

属性名称

描述

android:choiceMode

规定此ListView所使用的选择模式。缺省状态下,list没有选择模式。

属性值必须设置为下列常量之一: none,值为0,表示无选择模式;

singleChoice,值为1,表示最多能够有一项被选中;

multipleChoice,值为2,表示能够多项被选中。

可参看全局属性资源符号choiceMode。

android:divider

规定List项目之间用某个图形或颜色来分隔。能够用"@[+][package:]type:name"或者"?[package:][type:]name"(主题属性)的形式来指向某个已有资源;也能够用"#rgb","#argb","#rrggbb"或者"#aarrggbb"的格式来表示某个颜色。

可参看全局属性资源符号divider。

android:dividerHeight

分隔符的高度。若没有指明高度,则用此分隔符固有的高度。必须为带单位的浮点数,如"14.5sp"。可用的单位如px(pixel像素),dp(density-independent pixels 与密集度无关的像素),  sp(scaled pixels based on preferred font size 基于字体大小的固定比例的像素), in (inches英寸), mm (millimeters毫米)。

能够用"@[package:]type:name

"或者"?[package:][type:]name"(主题属性)的格式来指向某个包含此类型值的资源。

可参看全局属性资源符号dividerHeight。

android:entries

引用一个将使用在此ListView里的数组。若数组是固定的,使用此属性将比在程序中写入更为简单。

必须以"@[+][package:]type:name"或者 "?[package:][type:]name"的形式来指向某个资源。

可参看全局属性资源符号entries。

android:footerDividersEnabled

设成flase时,此ListView将不会在页脚视图前画分隔符。此属性缺省值为true。

属性值必须设置为true或false。

能够用"@[package:]type:name

"或者"?[package:][type:]name"(主题属性)的格式来指向某个包含此类型值的资源。

可参看全局属性资源符号footerDividersEnabled。

android:headerDividersEnabled

设成flase时,此ListView将不会在页眉视图后画分隔符。此属性缺省值为true。

属性值必须设置为true或false。

能够用"@[package:]type:name

"或者"?[package:][type:]name"(主题属性)的格式来指向某个包含此类型值的资源。

可参看全局属性资源符号headerDividersEnabled。

 

常量:

  Int    CHOICE_MODE_MULTIPLE    

(常量值为2)列表容许同时选取多项

Int    CHOICE_MODE_NONE            

(常量值为0)普通列表,不指明选取模式

Int    CHOICE_MODE_SINGLE         

(常量值为1)列表只容许选取最多一项

 

9.4 ListView的使用示例

首先在XML中声明一个ListView,一个TextView用来显示ListView的监听结果:

<TextView  android:id="@+id/TextView01"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:text="@string/hello" />

   <ListView android:id="@+id/ListView01"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content">

   </ListView>

而后在Avticity中:

final TextView textView = (TextView)findViewById(R.id.TextView01);

        ListView listView = (ListView)findViewById(R.id.ListView01);

        //建立数组list,用于存放要显示的内容

        final List<String> list  = new ArrayList<String>();

        list.add("ListView子项1");

        list.add("ListView子项2");

        list.add("ListView子项3");

        //将数据与适配器adapter链接

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, list );

       //将adapter添加到ListView

        listView.setAdapter(adapter);

       

        //实现ListView的监听

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

 

        @Override

        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,

              long arg3) {

           // TODO Auto-generated method stub

           textView.setText("你当前选择的是"+list.get(arg2).toString());

        }

         

        });

       

示例的效果图以下:

 

9.5关于ListView使用的参考连接

Android入门第六篇之ListView (一)

                   android ListView详解

                   android异步加载ListView中的图片

                   Google I/O 2010 - The world of ListView

                   Android: 显示SD卡文件列表

                   Android: 带图标的ListView实现

ListView和getView的原理+如何在ListView中放置多个item

 

10 TabHost标签页

10.1 TabHost类的层次关系

继承关系

public class TabHost extends FrameLayout implements ViewTreeObserver.OnTouchModeChangeListener

        

java.lang.Object

android.view.View

        android.view.ViewGroup

                android.widget.FrameLayout

                        android.widget.TabHost

10.2 TabHost经常使用的方法

内部类

interface TabHost.OnTabChangeListener    

接口定义了当选项卡更改时被调用的回调函数

 

interface TabHost.TabContentFactory  

当某一选项卡被选中时生成选项卡的内容

 

class TabHost.TabSpec     

单独的选项卡,每一个选项卡都有一个选项卡指示符,内容和tag标签,以便于记录.

 

公共方法

(1)public void addTab (TabHost.TabSpec tabSpec)

新增一个选项卡

参数

tabSpec    指定怎样建立指示符和内容.

 

(2)public void clearAllTabs ()

从tab widget中移除全部关联到当前tab host的选项卡

 

(3)public boolean dispatchKeyEvent (KeyEvent event)

分发按键事件到焦点传递路线上的下一视图。焦点传递路线从视图树的顶层开始一直到当前获取焦点的视图中止。若是此视图已经获取焦点,将分发给它自身。不然,将分发到焦点传递路线的下一节点。此方法会触发任何一个按键监听器.

(译者注:关于focus path,能够参考如下地址:

http://blog.csdn.net/maxleng/archive/2010/05/04/5557758.aspx)

参数

event        分发的按键事件

返回值

若是事件已经处理则返回true,不然返回false.

 

(4)public void dispatchWindowFocusChanged (boolean hasFocus)

当窗口包含的此视图获取或丢失焦点时触发此方法.ViewGroups应该重写以路由到他的子元素

参数

hasFocus 若是窗口包含的此view依获取焦点,返回true,不然返回false.

 

(5)public int getCurrentTab ()

(译者注:获取当前选项卡的id)

 

(6)public String getCurrentTabTag ()

(译者注:当前选项卡的Tag标签内容)

 

(7)public View getCurrentTabView ()

(译者注:获取当前选项卡的视图view)

 

(8)public View getCurrentView ()

(译者注:获取当前的视图view)

 

(9)public FrameLayout getTabContentView ()

获取保存tab内容的FrameLayout

 

(10)public TabWidget getTabWidget ()

(译者注:根据系统规定的id:tabs来找到TabWidget,并返回,注意,这里的ID必须是tabs。源代码中表示以下:

private TabWidget mTabWidget;

mTabWidget=(TabWidget)findViewById(com.android.internal.R.id.tabs);

 

(11)public TabHost.TabSpec newTabSpec (String tag)

获取一个新的TabHost.TabSpec,并关联到当前tab host

参数

tag   所需的选项卡标签(tag)

 

(12)public void onTouchModeChanged (boolean isInTouchMode)

当触摸模式发生改变时调用的回调函数.

参数

isInTouchMode         若是视图结构当前处于触摸模式,返回true,不然返回false.

 

(13)public void setCurrentTab (int index)

(译者注:设置当前的选项卡

参数

Index        为当前选项卡的索引。)

 

(14)public void setCurrentTabByTag (String tag)

(译者注:根据选项卡的Tab标签来设置当前的选项卡

                            参数

tag  想要被设置为当前选项卡的tag标签值。)

 

(15)public void setOnTabChangedListener(TabHost.OnTabChangeListener l)

注册一个回调函数,当选项卡中的任何一个tab的选中状态发生改变时调用。

(译者注:setCurrentTab(index)时会触发调用)

参数

l        将运行的回调函数

        

(16)public void setup ()

若是使用findViewById()加载TabHost,那么在新增一个选项卡tab以前,须要调用setup()。然而,当你在一个TabActivity里使用getTabHost()获取TabHost,你就再也不须要调用setup()了。(译者注:实现tab窗口的两种方法:继承activity时,使用findViewById()查找TabHost,而后调用setup();继承TabActivity,经过getTabHost()查找,此时不用调用setup())例子:

 

 

(17)public void setup (LocalActivityManager activityGroup)

若是你使用setContent(android.content.Intent),那么当activityGroup用于加载本地activity之时,必须调用此方法。若是你拓展(继承)TabActivity将自动调用setup()方法。

参数

activityGroup   用来为选项卡内容加载activities的ativityGroup

 

受保护方法

protected void onAttachedToWindow ()

当视图附加到窗口上时被调用。在这个点的表面进行绘制。注意此函数确保在onDraw(Cancas)以前调用,然而它可能在第一次执行onDraw以前的任什么时候间被调用——包括的onMeasure(int,int)的以前或以后。

 

protected void onDetachedFromWindow ()

当视图从窗口分离时被调用。在这个点的表面再也不有画面绘制。

 

10.3 TabHost的使用示例

咱们这里使用3个XML来实现

tab1.xml文件代码:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout android:id = "@+id/layout01"

  ……

  ……

</LinearLayout>

tab2.xml文件代码:

<?xml version="1.0" encoding="utf-8"?>

<AbsoluteLayout android:id="@+id/layout02"

  ……

  ……

</AbsoluteLayout>

tab3.xml文件代码:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout android:id="@+id/layout03"

  ……

……

</RelativeLayout>

 

注意:在Activity中咱们继承的是TabActivity:

public class TabDemo extends TabActivity {

TabHost tabHost = getTabHost();

        LayoutInflater.from(this).inflate(R.layout.tab1,
                      tabHost.getTabContentView(),true);

        LayoutInflater.from(this).inflate(R.layout.tab2,
                      tabHost.getTabContentView(),true);

        LayoutInflater.from(this).inflate(R.layout.tab3,
                      tabHost.getTabContentView(),true);

        tabHost.addTab(tabHost.newTabSpec("TAB1")

               .setIndicator("线性布局").setContent(R.id.layout01));

        tabHost.addTab(tabHost.newTabSpec("TAB2")

               .setIndicator("绝对布局").setContent(R.id.layout02));

        tabHost.addTab(tabHost.newTabSpec("TAB3")

               .setIndicator("相对布局").setContent(R.id.layout03));

 

 

 

10.4 补充

补充

文章连接

         史上最全的Android的Tab与TabHost讲解

         Android UI设计 Tab TabHost标签页的使用

         Android 控件之TabHost Tab页

动态Tab页

 

 

11 LinearLayout线性布局

11.1 线性布局介绍

LinearLayout是一种线性排列的布局,在线性布局中,全部的子元素都按照垂直或水平的顺序在界面上排列:

若是垂直排列,则每行仅包含一个界面元素,若是水平排列,则每列仅包含一个界面元素。能够经过属性android:orientation定义布局中子元素的排列方式。android.widget.LinearLayout类是android.view.viewGroup的子类,其中又派生了RadioGroup、TabWidget、TableLayout、TableRow、ZoomControls等类。

11.2 线性布局的经常使用属性

  Android:id       为控件指定相应的ID

 

 Android:text      指定控件当中显示的文字,须要注意的是,这里尽可能使用strings.xml文件当中的字符

 

Android:grivity     指定控件的基本位置,好比说居中,居右等位置Android:textSize    指定控件当中字体的大小                      Android:background     指定该控件所使用的背景色,RGB命名法

Android:width          指定控件的宽度

Android:height        指定控件的高度

Android:padding*      指定控件的内边距,也就是说控件当中的内容

Android:sigleLine   若是设置为真的话,则将控件的内容在同一行当中进行显示   

 

 

 

11.3 Linear经常使用的方法

方法

功能描述

返回值

LinearLayout

两个构造函数:

LinearLayout(Contex context)

LinearLayout(Contex contex,AttributeSet attrs)

null

getOrientation()

获取布局的方向设置。0表明水平方向,1表明垂直方向

int

isBaselineAligned()

判断布局是否按照基线对齐

boolean

setBaselineAligned(boolen baselineAligned)

根据参数设置基线对齐

void

setGravity(int gravity)

根据指定的重力设置元素的大小

void

setHorizontalGravity(int gravity)

设置水平方向的重力

void

setVerticalGravity(int gravity)

设置垂直方向的重力

void

gennerateDefaultLayoutParams

返回包含宽度和高度的布局参数的集合

LayoutParams

setGravity(int gravity)

设置布局的重力

void

 

 

 

 

11.4 LinearLayout的使用

在XML中设置以下:

<!-- 水平线性布局 -->

   <LinearLayout android:layout_height="100dip"

      android:orientation="horizontal" android:layout_width="fill_parent">

      <TextView android:background="#aa0000" android:layout_width="wrap_content"

        android:gravity="center_horizontal" android:text="第一列"

        android:layout_weight="1" android:layout_height="50dip"></TextView>

      <TextView android:background="#00aa00" android:layout_width="wrap_content"

        android:gravity="center_horizontal" android:text="第二列"

        android:layout_weight="1" android:layout_height="50dip"></TextView>

      <TextView android:background="#0000aa" android:layout_width="wrap_content"

        android:gravity="center_horizontal" android:text="第三列"

        android:layout_weight="1" android:layout_height="50dip"></TextView>

   </LinearLayout>

 

<!-- 垂直线性布局 -->

<LinearLayout

    android:layout_height="100dip"

      android:orientation="vertical" android:layout_width="fill_parent">

      <TextView android:background="#aa0000" android:layout_width="fill_parent"

        android:gravity="center_horizontal" android:text="第一行"

        android:layout_weight="1" android:layout_height="50dip"></TextView>

      <TextView android:background="#00aa00" android:layout_width="fill_parent"

        android:gravity="center_horizontal" android:text="第二行"

        android:layout_weight="1" android:layout_height="50dip"></TextView>

      <TextView android:background="#0000aa" android:layout_width="fill_parent"

        android:gravity="center_horizontal" android:text="第三行"

        android:layout_weight="1" android:layout_height="50dip"></TextView>

   ></LinearLayout>

 

而后在就能够直接显示:

 

 

 

12 FrameLayout框架布局

12.1 FrameLayout的简单介绍

FrameLayout是布局中最简单的一个布局,在这个布局中,整个界面被当成一块空白备用区域,全部的子元素都不能被指定放置的位置,它们通通放于这块区域的左上角,而且后面的子元素直接覆盖在前面的子元素之上,将前面的子元素部分和所有遮挡。

 

12.2 FrameLayout的使用

FrameLayout的使用很简单,在XML中的声明为FrameLayout就能够:

<?xml version="1.0" encoding="utf-8"?>

 

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

<TextView 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:textSize="50dip"

    android:textColor="#ffffff"

    android:text="第一层"/>

<TextView 

 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:textSize="40dip"

    android:textColor="#ffff00"

    android:text="第二层"/>

<TextView 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:textSize="30dip"

    android:textColor="#ff00ff"

    android:text="第三层"/>

<TextView 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:textSize="20dip"

    android:textColor="#00ffff"

    android:text="第四层"/>

</FrameLayout>

 

 

13 TableLayout表格布局

13.1 TableLayout的层次关系

 

表格布局(TableLayout)也是一种经常使用的界面布局,它将屏幕划分网格,经过指定行和列能够将界面元素添加的网格中。

 

 
   

 

 

 

 

 

 

 

 

 

TableLayout事实上是LinearLayout的子类,它的层次关系以下:

java.lang.Object

 android.view.View

   android.widget.ViewGroup

     android.widget.LinearLayout

       android.widget.TableLayout

 

 

 

13.2 TableLayout经常使用的方法

构造函数

public TableLayout (Context context)

为给定的上下文建立表格布局。

                   参数

context   应用程序上下文

 

public TableLayout (Context context, AttributeSet attrs)

使用指定的属性集合为给定的上下文建立表格布局。

                   参数

context   应用程序上下文

attrs        属性集合

 

公共方法

public void addView (View child)

添加子视图。若是子视图没有设置布局参数,则使用视图组(ViewGroup)的布局参数为该视图布局。

                   参数

child         添加的子视图

 

public void addView (View child, int index)

添加子视图。若是子视图没有设置布局参数,则使用视图组(ViewGroup)的布局参数为该视图布局。

                   参数

child         添加的子视图

index       子视图加入的位置索引

 

public void addView (View child, int index, ViewGroup.LayoutParams params)

用指定的布局参数添加一个子视图。

                   参数

child         添加的子视图

index       子视图加入的位置索引

params   为子视图指定得布局参数

 

public void addView (View child, ViewGroup.LayoutParams params)

使用指定的布局参数添加子视图。

                   参数

child         添加的子视图

params   设置到子视图上的布局参数

 

public TableLayout.LayoutParams generateLayoutParams (AttributeSet attrs)

返回一组基于提供的属性集合的布局参数集合。

                   参数

attrs        用于生成布局参数的属性集

返回值

                       ViewGroup.LayoutParams或其子类的实例

 

public boolean isColumnCollapsed (int columnIndex)

返回指定列的折叠状态。

                   参数

columnIndex   列索引

返回值

折叠时为true;不然为false

 

public boolean isColumnShrinkable (int columnIndex)

返回指定的列是否可收缩。

                   参数

columnIndex   列索引

返回值

                       若是列能够收缩,返回true;不然返回false

 

public boolean isColumnStretchable (int columnIndex)

返回指定的列是否可拉伸。

                   参数

columnIndex   列索引

返回值

若是列能够拉伸,返回true;不然返回false

 

public boolean isShrinkAllColumns ()

指示是否全部的列都是可收缩的。

返回值

                       若是全部列均可收缩,返回true;不然返回false

 

public boolean isStretchAllColumns ()

指示是否全部的列都是可拉伸的。

返回值

                       若是全部列均可拉伸,返回true;不然返回false

 

public void requestLayout ()

当某些变动致使视图的布局失效时调用该方法。该方法按照视图树的顺序调用。

 

public void setColumnCollapsed (int columnIndex, boolean isCollapsed)

折叠或恢复给定列。折叠时,列从屏幕上消失,其空间由其它列占用。 当列属于 TableRow 时才能够进行折叠/恢复操做。

调用该方法会请求布局操做。

                 相关XML属性

                       android:collapseColumns

                   参数

columnIndex   列索引

isCollapsed     折叠时为true;不然为false

 

public void setColumnShrinkable (int columnIndex, boolean isShrinkable)

设置指定列是否可收缩。当行太宽时,表格能够收缩该列以提供更多空间。

调用该方法会请求布局操做。

                   相关XML属性

                            android:shrinkColumns

                   参数

columnIndex   列索引

isShrinkable    若是列能够收缩,设为真;不然设为假。默认是假。

 

public void setColumnStretchable (int columnIndex, boolean isStretchable)

设置指定列是否可拉伸。可拉伸时,列会尽量多的占用行中的可用空间。

调用该方法会请求布局操做。

                   相关XML属性

                            android:stretchColumns

                   参数

columnIndex   列索引

isStretchable 若是列能够拉伸,设为真;不然设为假.默认是假

 

public void setOnHierarchyChangeListener (ViewGroup.OnHierarchyChangeListener listener)

注册当从视图中添加或移除子视图时发生的回调函数。

                   参数

listener   层次结构变动时执行的回调函数

 

public void setShrinkAllColumns (boolean shrinkAllColumns)

标记全部列为可收缩的便利的方法。

                   相关XML属性

android:shrinkColumns

                   参数

shrinkAllColumns    若是标记全部列为可收缩时为true

 

public void setStretchAllColumns (boolean stretchAllColumns)

标记全部列为可拉伸的便利的方法。

                   相关XML属性

                            android:stretchColumns

                   参数

stretchAllColumns           若是标记全部列为可拉伸时为true

 

受保护方法

protected boolean checkLayoutParams (ViewGroup.LayoutParams p)

         (译者注:检测是否是AbsoluteLayout.LayoutParams的实例)

 

protected LinearLayout.LayoutParams generateDefaultLayoutParams ()

返回宽度为MATCH_PARENT, 高度为WRAP_CONTENT的布局参数集合。

                   返回值

默认布局参数集合或空

 

protected LinearLayout.LayoutParams generateLayoutParams (ViewGroup.LayoutParams p)

基于提供的布局参数返回一组安全的布局参数集合.当传入 ViewGroup 的视图的参数没有经过checkLayoutParams(android.view.ViewGroup.LayoutParams) 的检测时,调用该方法. 该方法会返回适合 ViewGroup 的新的布局参数,可能从指定的布局参数中复制适当的属性。

                   参数

p      要转换为适合于 ViewGroup 的布局参数的集合

                   返回值

                       ViewGroup.LayoutParams或其子类的实例

 

protected void onLayout (boolean changed, int l, int t, int r, int b)

该视图设置其子视图的大小及位置时调用.派生类能够重写此方法,并为其子类布局。

                   参数

changed           是否为视图设置了新的大小和位置

l       相对于父视图的左侧的位置

t      相对于父视图的顶部的位置

r      相对于父视图的右侧的位置

b      相对于父视图的底部的位置

 

protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

评估视图及其内容,以决定其宽度和高度.此方法由measure(int, int) 调用,子类能够重载以提供更精确、更有效率的衡量其内容尺寸的方法。

约定: 覆盖该方法时,必须调用 setMeasuredDimension(int, int) 方法来保存评估结果的视图的宽度和高度.若是忘记将致使 measure(int, int) 方法抛出IllegalStateException异常.要有效的利用父类的onMeasure(int, int)方法。

基类测量的是背景的大小,除非 MeasureSpec 容许超过背景.子类应该重写 onMeasure(int, int) 方法,觉得其内容提供更适合的大小。

若是重写了该方法,子类要确保其高度和宽度大于等于视图的最小高度和宽度. (getSuggestedMinimumHeight()getSuggestedMinimumWidth()

                   参数

widthMeasureSpec         父视图要求的横向空间大小.该要求由 View.MeasureSpec 进行了编码处理。

heightMeasureSpec        父视图要求的纵向空间大小.该要求由 View.MeasureSpec 进行了编码处理。

 

 

13.3 TableLayout经常使用的属性

android:collapseColumns:以第0行为序,隐藏指定的列:

android:collapseColumns该属性为空时,以下图:

 

把android:collapseColumns=0,2--------------》意思是把第0和第2列去掉,以下图:

 

android:shrinkColumns:以第0行为序,自动延伸指定的列填充可用部分:

当LayoutRow里面的控件尚未布满布局时,shrinkColumns不起做用,以下图:

 

设置了shrinkColumns=0,1,2,布局彻底没有改变,由于LayoutRow里面还剩足够的空间。

当LayoutRow布满控件时,以下图:

 

设置设置了shrinkColumns=2,则结果以下图,控件自动向垂直方向填充空间:

 

android:stretchColumns:以第0行为序,尽可能把指定的列填充空白部分:

 

设置stretchColumns=1,则结果以下图,第1列被尽可能填充(Button02与TextView02同时向右填充,直到TextView03被压挤到最后边)。

 

 

 

13.4 TableLayout的使用

若是如今咱们要实现下图所示的布局效果 :

 

 

咱们要在XML文件中做以下的相关声明和设置:

<TableLayout android:id="@+id/TableLayout01"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

xmlns:android="http://schemas.android.com/apk/res/android">

<TableRow android:id="@+id/TableRow01"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content">

        <TextView android:id="@+id/label"

               android:layout_height="wrap_content"

               android:layout_width="160dip"

               android:gravity="right"

               android:text="用户名:"

               android:padding="3dip" >

        </TextView>

<EditText android:id="@+id/entry"

               android:layout_height="wrap_content"

               android:layout_width="160dip“

               android:padding="3dip" >

        </EditText>

</TableRow>

 

<TableRow android:id="@+id/TableRow02"

       android:layout_width="wrap_content"

        android:layout_height="wrap_content">

        <Button android:id="@+id/ok"

               android:layout_height="wrap_content"

               android:padding="3dip"

               android:text="确认">

        </Button>

<Button android:id="@+id/Button02"

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"

               android:padding="3dip"

               android:text="取消">

        </Button>

</TableRow>

   </TableLayout>

 

14 RelativeLayout相对布局

14.1 RelativeLayout类的层次关系

相对布局(RelativeLayout)是一种很是灵活的布局方式,可以经过指定界面元素与其余元素的相对位置关系,肯定界面中全部元素的布局位置

特色:可以最大程度保证在各类屏幕类型的手机上正确显示界面布局。它的层次关系以下所示:

java.lang.Object

 android.view.View

   android.widget.ViewGroup

     android.widget.RelativeLayout

14.2 RelativeLayout经常使用的方法

方法

功能描述

返回值

RelativeLayout

两个构造函数:

RelativeLayout(Contex contex)

RelativeLayout(Contex contex,AttributeSet attrs

null

checkLayoutParams(viewGroup.LayoutParams p

检查参数指定的布局参数是不是LayoutParams实例

boolen

isBaselineAligned()

判断布局是否按照基线对齐

boolean

set BaselineAligned(boolean baseelineAligned)

根据参数设置基线对齐

void

setGravityt (int gravity)

根据指定的重力设置元素大小

void

setHorizontalGravity(int gravity)

设置水平方向的重力

void

setVerticalGravity(int gravity)

设置垂直方向的重力

void

gennerateDefaultLayoutParams

生成默认的布局参数实例

ViewGroup.LayoutParams

 

14.3 RelativeLayout经常使用的属性

android:layout_above        将该控件的底部至于给定ID的控件之上

android:layout_below        将该控件的顶部至于给定ID的控件之下

android:layout_toLeftOf      将该控件的右边缘和给定ID的控件的左边缘对齐

android:layout_toRightOf     将该控件的左边缘和给定ID的控件的右边缘对齐android:layout_alignBaseline 该控件的baseline和给定ID的控件的baseline对齐

android:layout_alignBottom     将该控件的底部边缘与给定ID控件的底部边缘

android:layout_alignLeft     将该控件的左边缘与给定ID控件的左边缘对齐

android:layout_alignRight      将该控件的右边缘与给定ID控件的右边缘对齐

android:layout_alignTop      将给定控件的顶部边缘与给定ID控件的顶部对齐

android:alignParentBottom    若是该值为true,则将该控件的底部和父控件的底部对齐

android:layout_alignParentLeft      若是该值为true,则将该控件的左边与父控件的左边对齐

android:layout_alignParentRight    若是该值为true,则将该控件的右边与父控件的右边对齐

android:layout_alignParentTop      若是该值为true,则将空间的顶部与父控件的顶齐

android:layout_centerHorizontal    若是值为真,该控件将被至于水平方向的中央

android:layout_centerInParent      若是值为真,该控件将被至于父控件水平方向和垂直方向的中央

android:layout_centerVertical        若是值为真,该控件将被至于垂直方向的中央

 

14.4 RelativeLayout的使用

 

 

好比要实现上面的布局效果,咱们须要在 在xml中作以下的声明:

<RelativeLayout android:id="@+id/RelativeLayout01"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

xmlns:android="http://schemas.android.com/apk/res/android">

<TextView android:id="@+id/label"

        android:layout_height="wrap_content"

        android:layout_width="fill_parent"

        android:text="用户名:">

</TextView>

<EditText android:id="@+id/entry"

        android:layout_height="wrap_content"

        android:layout_width="fill_parent"

android:layout_below="@id/label"> //肯定EditText控件在IDlabel的元素下方

 

</EditText>

  <Button android:id="@+id/cancel"

      android:layout_height="wrap_content"

        android:layout_width="wrap_content"

android:layout_alignParentRight="true"  //声明该元素在其父元素的右边边界对齐

              android:layout_marginLeft="10dip" //左移10dip

        android:layout_below="@id/entry"

        android:text="取消" >

</Button>

<Button android:id="@+id/ok"

        android:layout_height="wrap_content"

        android:layout_width="wrap_content"

              android:layout_toLeftOf="@id/cancel" //声明该元素在IDcancel元素的左边

              android:layout_alignTop="@id/cancel“ //声明该元素与IDcancel的元素在相同的水平位置

 

        android:text=“确认”>

</Button>

</RelativeLayout>

 

 

 

 

 

 

 

15 AbsoluteLayout绝对布局

15.1 AbsoluteLayout层次关系

绝对布局(AbsoluteLayout)能经过指定界面元素的坐标位置,来肯定用户界面的总体布局

绝对布局是一种不推荐使用的界面布局,由于经过X轴和Y轴肯定界面元素位置后,Android系统不可以根据不一样屏幕对界面元素的位置进行调整,下降了界面布局对不一样类型和尺寸屏幕的适应能力。

同其余布局同样,android.widget.AbsoluteLayout是android.view.ViewGroup类的子类,其层次关系以下:

java.lang.Object

  android.view.View

android.widget.ViewGroup

  android.widget.AbsoluteLayout

 

15.2 AbsoluteLayout经常使用的方法

方法

功能描述

返回值

AbsoluteLayout

提供了3个构造函数

null

checkLayoutParams(ViewGroup.LayoutParams p)

检查参数指定的布局参数是不是LayoutParams实例

 

onLayout(boolean changed,int l,int t,int r,int b)

视图的布局改变时,该方法被调用

boolean

setBaselineAligned(boolean baseelineAligned)

根据参数设置基线对齐

boolen

onMeasure(int widthMesureSpec, int h)

该方法被measure调用,用于测量视图的高度和宽度

void

setHorizontalGravity(int gravity)

设置水平方向是的重力

void

 

15.3 AbsoluteLayout经常使用属性

对与AbsoluteLayout标签,最主要的两个参数是

android:layout_x  指定X坐标的位置

android:layout_y  指定Y坐标的位置

 

AbsoluteLayout经常使用的属性有:

第一类:属性值为true或false
android:layout_centerHrizontal                                           水平居中
android:layout_centerVertical                                            垂直居中
android:layout_centerInparent                                           相对于父元素彻底居中
android:layout_alignParentBottom                                     贴紧父元素的下边缘
android:layout_alignParentLeft                                          贴紧父元素的左边缘
android:layout_alignParentRight                                        贴紧父元素的右边缘
android:layout_alignParentTop                                          贴紧父元素的上边缘
android:layout_alignWithParentIfMissing                            若是对应的兄弟元素找不到的话就以父元素作参照物

第二类:属性值必须为id的引用名“@id/id-name”
android:layout_below                          在某元素的下方
android:layout_above                          在某元素的的上方
android:layout_toLeftOf                       在某元素的左边
android:layout_toRightOf                     在某元素的右边

android:layout_alignTop                      本元素的上边缘和某元素的的上边缘对齐
android:layout_alignLeft                      本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom                 本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight                    本元素的右边缘和某元素的的右边缘对齐

第三类:属性值为具体的像素值,如30dip,40px
android:layout_marginBottom              离某元素底边缘的距离
android:layout_marginLeft                   离某元素左边缘的距离
android:layout_marginRight                 离某元素右边缘的距离
android:layout_marginTop                   离某元素上边缘的距离

 

15.4 AbsoluteLayout的使用

 

 

要实现上图所示的效果,咱们能够在XML布局声明以下:

<AbsoluteLayout android:id="@+id/AbsoluteLayout01"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

xmlns:android="http://schemas.android.com/apk/res/android">

<TextView android:id="@+id/label"

        android:layout_x="40dip"

        android:layout_y="40dip"

        android:layout_height="wrap_content"

        android:layout_width="wrap_content"

        android:text="用户名:">

</TextView>

<EditText android:id="@+id/entry"

        android:layout_x="40dip"

        android:layout_y="60dip"

android:layout_height="wrap_content" 8.                               android:layout_width="150dip">

        </EditText>

       <Button android:id="@+id/ok"

                 android:layout_width="70dip"

          android:layout_height="wrap_content"   

             android:layout_x="40dip"

                android:layout_y="120dip" 

                android:text="确认">

       </Button>

    <Button android:id="@+id/cancel"

                 android:layout_width="70dip"

              android:layout_height="wrap_content"

                 android:layout_x="120dip"

              android:layout_y="120dip"       

              android:text="取消">

</Button>

   </AbsoluteLayout>

 

15.5 补充

文章链接:

      个人Android学习之旅[6]——以示例程序来展现Android的几种布局方式

                第六讲:用户界面 View(二)

                如何动态改变 AbsoluteLayout布局中其它布局的坐标

 

 

 

 

16 Menu菜单

16.1 Menu的介绍

菜单是应用程序中很是重要的组成部分,可以在不占用界面空间的前提下,为应用程序提供了统一的功能和设置界面,并为程序开发人员提供了易于使用的编程接口

Android系统支持三种菜单

选项菜单(Option Menu)

子菜单(Submenu)

上下文菜单(Context Menu)

 

16.2选项菜单的介绍以及使用

选项菜单是一种常常被使用的Android系统菜单

打开方式:经过“菜单键”(MENU key)打开

选项菜单分类:

图标菜单(Icon Menu)

扩展菜单(Expanded Menu)

(1)图标菜单可以同时显示文字和图标的菜单,最多支持6个子项

图标菜单不支持单选框和复选框

 

 

(2)扩展菜单是在图标菜单子项多余6个时才出现,经过点击图标菜单最后的子项“More”才能打开

扩展菜单是垂直的列表型菜单

不可以显示图标

支持单选框和复选框

 

 

下面咱们就要来实现选项菜单的功能:

 

 

16.3子菜单的介绍以及使用

子菜单是可以显示更加详细信息的菜单子项

菜单子项使用了浮动窗体的显示形式,可以更好适应小屏幕的显示方式

 

子菜单不支持嵌套

子菜单的添加是使用addSubMenu()函数实现

 

 

16.4上下文菜单的介绍以及使用

快捷菜单一样采用了动窗体的显示方式,与子菜单的实现方式相同,但两种菜单的启动方式却大相径庭

启动方式:快捷菜单相似于普通桌面程序中的“右键菜单”,当用户点击界面元素超过2秒后,将启动注册到该界面元素的快捷菜单

使用方法:与使用选项菜单的方法很是类似,须要重载onCreateContextMenu()函数和onContextItemSelected()函数

onCreateContextMenu()函数主要用来添加快捷菜单所显示的标题、图标和菜单子项等内容

 

上下文菜单经常使用的方法:

setHeaderIcon(int iconRes) 设置上下文菜单的图标

setHeaderIcon(Drawable icon) 上下文菜单的图标

setHeaderTitle(Charsequence title) 设置上下文菜单的标题

setHeaderTitle(int titleRes)设置上下文菜单的标题

add(int groupId,int itemId,int order, CharSequence title) 使用add方法添加 子菜单:

groupId:组Id

itemId:菜单项Id

order :顺序号

title :菜单项标题

 

 

17 AutoCompleteTextView自动提示

17.1 AutoCompleteTextView类层次关系

AutoCompleteTextView控件是用户在文本框中输入的时候,在控件下方会显示一个相似 百度的下拉提示框,提示当前与输入相匹配的选项,用户能够直接选择,方便了用户的直接体验。

 

 

 

AutoCompleteTextView类的层次关系以下:

java.lang.Object

android.view.view

android.view.TextView

android.widget.EditText

android.widget. AutoCompleteTextView

 

17.2 AutoCompleteTextView经常使用的方法

方法

功能描述

返回值

setMarqueeRepeatLimit

在指定的marquee的状况下,设置重复滚动的次数,当设置为marquee_forever时表示无限次

void

enoughToFilter

当文本长度超过阀值时过滤

boolean(true/False)

performValidation

肯定文本中单个符号的有效性

void

setTokenzier

设置分词组件,该组件决定用户正在输入文本的范围

void

performFiltering

过滤从函数findTokenStart()到函数getSelectionEnd()得到的长度为0或者超过了预约值的文本内容

void

replaceText

根据参数的文本替换从函数findTokenStart()到函数getSelectionEnd()得到的文本

void

 

17.3 AutoCompleteTextView的实现

AutoCompleteTextView在XML中的声明方式以下:

<AutoCompleteTextView

  android:id="@+id/AutoCompleteTextView01"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  >

  </AutoCompleteTextView>

  <MultiAutoCompleteTextView

  android:id="@+id/MultiAutoCompleteTextView01"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  >

  </MultiAutoCompleteTextView>

AutoCompleteTextView在代码中的实现步骤:

      //关联关键字

       ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,

               android.R.layout.simple_dropdown_item_1line, autoString);

       

       AutoCompleteTextView m_AutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.AutoCompleteTextView01);

       

       //将adapter添加到AutoCompleteTextView中

       m_AutoCompleteTextView.setAdapter(adapter);

       ///////////////////

       MultiAutoCompleteTextView mm_AutoCompleteTextView = (MultiAutoCompleteTextView) findViewById(R.id.MultiAutoCompleteTextView01);

       //将adapter添加到AutoCompleteTextView中

       mm_AutoCompleteTextView.setAdapter(adapter);

       mm_AutoCompleteTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());

 

17.4补充

补充

相关文章连接

Android控件之AutoCompleteTextView、MultiAutoCompleteTextView探究

AutoCompleteTextView和MultiAutoCompleteTextView

Auto Complete Text

 

18 DatePicker日期

18.1 DatePicker的类层次关系

DatePicker日期选择器是一个选择年月日的日历布局视图,它的类层次关系以下:

 public class DatePicker extends FrameLayout

 

java.lang.Object

android.view.View

       android.view.ViewGroup

              android.widget.FrameLayout

                     android.widget.DatePicker

 

                                  

18.2 DatePicker的经常使用方法

公共方法

         (1)public int getDayOfMonth ()

         获取选择的天数

 

         (2)public int getMonth ()

         获取选择的月份。(注意:返回数值为0..11,须要本身+1来显示)

 

        (3) public int getYear ()

         获取选择的年份

 

         (4)public void init (int year, int monthOfYear, int dayOfMonth, DatePicker.OnDateChangedListener onDateChangedListener)

         初始化状态。(初始化年月日)

                   参数:

                            year :        初始年(注意使用new Date()初始化年时,须要+1900,以下:date.getYear() + 1900

                            monthOfYear: 初始月。

                            dayOfMonth:   初始日。

                            onDateChangedListener:         日期改变时通知用户的事件监听,能够为空(null)。

 

         (5)public void setEnabled (boolean enabled)

         设置视图的启用状态。该启用状态随子类的不一样而有不一样的解释。

                   参数

                            enabled True if this view is enabled, false otherwise.设置为true表示启动视图,反之禁用。

 

         (6)public void updateDate (int year, int monthOfYear, int dayOfMonth)

         更新日期

 

受保护方法

         (7)protected void dispatchRestoreInstanceState (SparseArray<Parcelable> container)

         重写使咱们可以彻底控制这小部件的保存或恢复。(译者注:此处直接调用了父类的ViewGroup. dispatchThawSelfOnly方法)

                   参数

                            container         SparseArray 持有保存之前的状态。The SparseArray which holds previously saved state.

 

         (8)protected void onRestoreInstanceState (Parcelable state)

         容许视图从新应用之前经过onSaveInstanceState()生成表明内部的状态。这个函数决不调用一个空的状态。

                   参数

                            state  返回之前调用onSaveInstanceState()保存下来的状态。

 

        (9) protected Parcelable onSaveInstanceState ()

         容许视图生成一个表明内部的状态,之后可用于建立一个与之相同的新的实例。这种状态应该只包含非持久或之后不可以重建的信息。例如,你决不存储你当前在屏幕上的位置,由于这会在视图的层面上从新计算放置一个新的实例。

         你能够存储到这里的一些例子:一个文本框中当前光标的位置(但一般不是文字自己,文字一般保存在内容提供者(content provider)或其余持久的储存中),一个列表视图中的当前选中项。

                   返回值

                            返回一个包含视图当前状态的Parcelable对象,或没有什么状态保存时返回null。默认实现返回null。

 

18.3 DatePicker的使用

首先在XML中声明一个DatePicker,和一个用户显示监听结果的TextView:

<DatePicker android:id="@+id/datePicker1"

   android:layout_height="wrap_content"

   android:layout_width="wrap_content"></DatePicker>

   <TextView

   android:id="@+id/textview1"

    android:layout_height="wrap_content"

    android:text="@string/hello"

android:layout_width="wrap_content"/>

 

而后在Activity中显示DatePicker并实现监听事件

textview = (TextView)findViewById(R.id.textview1);

        datepicker = (DatePicker)findViewById(R.id.datePicker1);

        //获取当前时间

        calendar = Calendar.getInstance();

        //显示当前的时间

        textview.setText("当前时间:"+calendar.get(Calendar.YEAR)+"年"

             +(calendar.get(Calendar.MONTH)+1)+"月"+calendar.get(Calendar.DAY_OF_MONTH)+"日");

       

        //注册监听事件,当日期改变时,更新TextView的内容

        datepicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() {

       

        @Override

        public void onDateChanged(DatePicker view, int year, int monthOfYear,

              int dayOfMonth) {

           // TODO Auto-generated method stub

           textview.setText("当前时间:"+year+"年"

                   +(monthOfYear+1)+"月"+dayOfMonth+"日");

        }

      });

效果以下显示:

 

 

 

 

19 TimePicker时间选择器

19.1 Timepicker类的层次关系

TimePicker时间选择器是用于选择一天中时间的视图,TimePicker类层次关系以下:

public class TimePicker extends FrameLayout

 

java.lang.Object

android.view.View

     android.view.ViewGroup

              android.widget.FrameLayout

                     android.widget.TimePicker

 

19.2 TimePicker类经常使用的方法

公共方法

         (1)public int getBaseline ()

         返回窗口空间的文本基准线到其顶边界的偏移量。若是这个部件不支持基准线对齐,这个方法返回-1/。

                   返回值

基准线的偏移量,若是不支持基准线对齐则返回-1。

 

        (2) public Integer getCurrentHour ()

         获取当前时间的小时部分。

                   返回值

                            当前小时(0-23)

 

         (3)public Integer getCurrentMinute ()

         获取当前时间的分钟部分。

                   返回值

                            当前分钟。

 

         (4)public boolean is24HourView ()

         获取当前系统设置是不是24小时制。

                   返回值

                            若是是24小时制返回true,不然返回false。

 

         (5)public void setCurrentHour (Integer currentHour)

    设置当前小时。

 

         (6)public void setCurrentMinute (Integer currentMinute)

         设置当前分钟(0-59)。

 

         (7)public void setEnabled (boolean enabled)

    设置可用的视图状态。可用的视图状态的解释在子类中改变。

                   参数

                            enabled  若是可用为true,不然为false。

 

         (8)public void setIs24HourView (Boolean is24HourView)

    设置是24小时仍是上午/下午制。

                   参数

                            is24HourView     True表示 24小时制. False表示上午/下午制.

 

         (9)public void setOnTimeChangedListener (TimePicker.OnTimeChangedListener onTimeChangedListener)

         设置时间调整事件的回调函数。

                   参数

                            onTimeChangedListener                   回调函数,不能为空。

 

受保护方法

         (10)protected void onRestoreInstanceState (Parcelable state)

         容许一个视图回复到以前用onSaveInstanceState()保存的状态,state参数不能为空。

                   参数

                            state     以前调用onSaveInstanceState()返回的状态。

 

         (11)protected Parcelable onSaveInstanceState ()

        

         用来容许一个视图保存当前的内部状态,以后能够建立新的实例应用相同的状态。状态信息不能包含常量或在以后从新构造。例如,你永远不能保存在屏幕上的当前位置,由于当建立一个新的视图时,它将会被放置到它的层次结构中,它的位置会被从新计算。

         你能够存储到这里的一些例子:一个文本框中当前光标的位置(但一般不是文字自己,文字一般保存在内容提供者(content provider)或其余持久的储存中),一个列表视图中的当前选中项。

                   返回值

           返回一个包含视图当前状态的Parcelable对象,或没有什么状态保存时返回null。默认实现返回null。

 

19.3 TimePicker的使用实例

TimePicker和DatePicker的使用同样:

XML中:

<TimePicker android:id="@+id/timePicker1"

   android:layout_width="wrap_content" android:layout_height="wrap_content"></TimePicker>

   

<TextView

    android:id="@+id/textview1" 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/hello"

/>

 

而后在 Activity中显示TimePicker并实现监听:

imepicker = (TimePicker)findViewById(R.id.timePicker1);

        textview  =(TextView)findViewById(R.id.textview1);

      //获取当前时间

        calendar = Calendar.getInstance();

        //显示当前的时间

        textview.setText("当前时间:"+calendar.get(Calendar.HOUR)+"时"

             +calendar.get(Calendar.MINUTE)+"分");

       

        //注册监听事件,当时间改变时,更新TextView的内容

        timepicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {

       

        @Override

        public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {

           // TODO Auto-generated method stub

           textview.setText("当前时间:"+hourOfDay+"时"

                   +minute+"分");

        }

      });

19.4 补充

补充

      文章连接

     [示例代码]Hello, TimePicker

     [示例代码]日期選擇器(DatePicker)和時間選擇器(TimePicker)

      Android TimePicker DatePicker 简单说明

 

 

 

20 Dialog对话框

20.1 Dialog对话框

Android中实现对话框可使用AlterDialog.Builder类,还能够自定义对话框。若是对话框设置了按钮,那么就须要对其设置监听OnClickListener。

 

20.2Dialog的使用

首先在Dialog.xml中定义一个对话框,咱们这里定义一个包含两个TextView和两个EditView的对话框

Dialog.xml中的布局以下:

<TextView

        android:id="@+id/username"

        android:layout_height="wrap_content"

        android:layout_width="wrap_content"

        android:layout_marginLeft="20dip"

        android:layout_marginRight="20dip"

        android:text="帐号"

        android:gravity="left"

        android:textAppearance="?android:attr/textAppearanceMedium" />

           

    <EditText

        android:id="@+id/username"

        android:layout_height="wrap_content"

        android:layout_width="fill_parent"

        android:layout_marginLeft="20dip"

        android:layout_marginRight="20dip"

        android:scrollHorizontally="true"

        android:autoText="false"

        android:capitalize="none"

        android:gravity="fill_horizontal"

        android:textAppearance="?android:attr/textAppearanceMedium" />

 

    <TextView

        android:id="@+id/password"

        android:layout_height="wrap_content"

        android:layout_width="wrap_content"

        android:layout_marginLeft="20dip"

        android:layout_marginRight="20dip"

        android:text="密码"

        android:gravity="left"

        android:textAppearance="?android:attr/textAppearanceMedium" />

           

    <EditText

        android:id="@+id/password"

        android:layout_height="wrap_content"

        android:layout_width="fill_parent"

        android:layout_marginLeft="20dip"

        android:layout_marginRight="20dip"

        android:scrollHorizontally="true"

        android:autoText="false"

        android:capitalize="none"

        android:gravity="fill_horizontal"

        android:password="true"

        android:textAppearance="?android:attr/textAppearanceMedium" />

 

 

 

 

main.xml布局中:

  

<TextView 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/hello"

    />

 

而后在Activity中使用AlterDialog建立对话框:

Dialog dialog = new AlertDialog.Builder(DialogActivity.this)

        .setTitle("登录提示")//设置标题

        .setMessage("这里须要登陆!")//设置内容

        .setPositiveButton("肯定",//设置肯定按钮

        new DialogInterface.OnClickListener()

        {

           public void onClick(DialogInterface dialog, int whichButton)

           {

              //点击“肯定”转向登录框

             

              LayoutInflater factory = LayoutInflater.from(DialogActivity.this);

              //获得自定义对话框

                   final View DialogView = factory.inflate(R.layout.dialog, null);

                   //建立对话框

                   AlertDialog dlg = new AlertDialog.Builder(DialogActivity.this)

                   .setTitle("登陆框")

                   .setView(DialogView)//设置自定义对话框的样式

                   .setPositiveButton("肯定", //设置"肯定"按钮

                   new DialogInterface.OnClickListener() //设置事件监听

                   {

                       public void onClick(DialogInterface dialog, int whichButton)

                       {

                       //输入完成后,点击“肯定”开始登录

                       m_Dialog = ProgressDialog.show

                                      (

                                      DialogActivity.this,

                                        "请等待...",

                                        "正在为你登陆...",

                                        true

                                      );

                          

                           new Thread()

                           {

                             public void run()

                             {

                               try

                               {

                                 sleep(3000);

                               }

                               catch (Exception e)

                               {

                                 e.printStackTrace();

                               }

                               finally

                               {

                                  //登陆结束,取消m_Dialog对话框

                                  m_Dialog.dismiss();

                               }

                             }

                           }.start();

                       }

                   })

                   .setNegativeButton("取消", //设置“取消”按钮

                   new DialogInterface.OnClickListener()

                   {

                       public void onClick(DialogInterface dialog, int whichButton)

                       {

                       //点击"取消"按钮以后退出程序

                       DialogActivity.this.finish();

                       }

                   })

                   .create();//建立

                   dlg.show();//显示

           }

        }).setNeutralButton("退出",

        new DialogInterface.OnClickListener()

        {

        public void onClick(DialogInterface dialog, int whichButton)

        {

           //点击"退出"按钮以后推出程序

           DialogActivity.this.finish();

        }

      }).create();//建立按钮

 

      // 显示对话框

      dialog.show();

 

实现的效果图:

 

21 ImageView图片视图

21.1 ImageView类的结构

ImageView显示任意图像,例如图标。ImageView类能够加载各类来源的图片(如资源或图片库),须要计算图像的尺寸,比便它能够在其余布局中使用,并提供例如缩放和着色(渲染)各类显示选项。

继承关系

public class View.OnClickListner extends View

 

java.lang.Object

android.view.View

android.widget.ImageView

 

直接子类

ImageButton, QuickContactBadge 

 

间接子类

ZoomButton

 

21.2 ImageView类属性

 

XML属性

属性名称

描述

android:adjustViewBounds

设置该属性为真能够在 ImageView 调整边界时保持图片的纵横比例。(译者注:须要与maxWidth、MaxHeight一块儿使用,不然单独使用没有效果。)

android:baseline

视图内基线的偏移量

android:baselineAlignBottom

若是为true,图像视图将基线与父控件底部边缘对齐。

android:cropToPadding

若是为真,会剪切图片以适应内边距的大小。(译者注:是否截取指定区域用空白代替。单独设置无效果,须要与scrollY一块儿使用,效果以下,实现代码见代码部分:

android:maxHeight

为视图提供最大高度的可选参数。(译者注:单独使用无效,须要与setAdjustViewBounds一块儿使用。若是想设置图片固定大小,又想保持图片宽高比,须要以下设置:

1)  设置setAdjustViewBounds为true;

2)  设置maxWidth、MaxHeight;

3)  设置layout_width和layout_height为wrap_content。)

android:maxWidth

为视图提供最大宽度的可选参数。

android:scaleType

控制为了使图片适合 ImageView 的大小,应该如何变动图片大小或移动图片。必定是下列常量之一:

常量

描述

matrix

0

用矩阵来绘图

fitXY

1

拉伸图片(不按比例)以填充View的宽高

 

fitStart

2

按比例拉伸图片,拉伸后图片的高度为View的高度,且显示在View的左边

 

fitCenter

3

按比例拉伸图片,拉伸后图片的高度为View的高度,且显示在View的中间

 

fitEnd

4

按比例拉伸图片,拉伸后图片的高度为View的高度,且显示在View的右边

 

center

5

按原图大小显示图片,但图片宽高大于View的宽高时,截图图片中间部分显示

 

centerCrop

6

按比例放大原图直至等于某边View的宽高显示。

 

centerInside

7

当原图宽高或等于View的宽高时,按原图大小居中显示;反之将原图缩放至View的宽高居中显示。

 

(译者注:设置图片的填充方式。)

android:src

设置可绘制对象做为 ImageView 显示的内容

android:tint

为图片设置着色颜色。(译者注:将图片渲染成指定的颜色。见下图:

左边为原图,右边为设置后的效果,见后面代码。)

 

21.3 ImageView经常使用的方法

公共方法

(1)public final void clearColorFilter ()

(译者注:清除颜色过滤,参见这里

 

         (2)public int getBaseline ()

         返回部件顶端到文本基线的偏移量。若是小部件不支持基线对齐,该方法返回 -1。

                   返回值

                            小部件顶端到文本基线的偏移量;或者是 -1 当小部件不支持基线对齐时。

 

         (3)public boolean getBaselineAlignBottom ()

         返回当前视图基线是否将考虑视图的底部。

                   参见

                            setBaselineAlignBottom(boolean)

 

         (4)public Drawable getDrawable ()

         返回视图的可绘制对象;若是没有关联可绘制对象,返回空。

 

         (5)public Matrix getImageMatrix ()

         返回视图的选项矩阵。当绘制时,应用于视图的可绘制对象。若是没有矩阵, 函数返回空。不要更改这个矩阵。若是你要为可绘制对象设置不一样的矩阵, 请调用 setImageMatrix()。

 

         (6)public ImageView.ScaleType getScaleType ()

返回当前 ImageView 使用的缩放类型。

相关 XML 属性

             android:scaleType

参见

               ImageView.ScaleType

 

         (7)public void invalidateDrawable (Drawable dr)

使指定的可绘制对象失效。

参数

dr    要设为失效的可绘制对象。

 

         (8)public void jumpDrawablesToCurrentState ()

调用与视图相关的全部可绘制对象的Drawable.jumpToCurrentState()方法。

 

         (9)public int[] onCreateDrawableState (int extraSpace)

为当前视图生成新的 Drawable 状态时发生。当视图系统检测到缓存的可绘制对象失效时,调用该方法.你可使用 getDrawableState() 方法从新取得当前的状态。

参数

extraSpace      若是为非零,该值为你要在返回值的数组中存放的你本身的状态信息的数量。

返回值

返回保存了视图的当前 Drawable 状态的数组。

 

         (10)public void setAdjustViewBounds (boolean adjustViewBounds)

当你须要在 ImageView 调整边框时保持可绘制对象的比例时,将该值设为真。

参数

adjustViewBounds          是否调整边框,以保持可绘制对象的原始比例。

相关 XML 属性

             android:adjustViewBounds

 

(11)public void setAlpha (int alpha)

(译者注:设置透明度)

 

(12)public void setBaseline (int baseline)

         设置部件顶部边界文本基线的偏移量。这个值覆盖setBaselineAlignBottom(boolean)设置的属性值。

参数

baseline 使用的基线,或不提供设置为-1。

相关 XML属性

               android:baseline

参见

             setBaseline(int)

 

(13)public void setBaselineAlignBottom (boolean aligned)

设置是否设置视图底部的视图基线。设置这个值覆盖setBaseline()的全部调用。

参数

aligned    若是为true,图像视图将基线与父控件底部边缘对齐。

相关 XML属性

             android:baselineAlignBottom

 

(14)public final void setColorFilter (int color)

为图片设置着色选项。采用SRC_ATOP合成模式。

参数

color        应用的着色颜色。

相关 XML 属性

    android:tint

 

(15)public void setColorFilter (ColorFilter cf)

为图片应用任意颜色滤镜。

参数

cf     要应用的颜色滤镜(可能为空)

 

(16)public final void setColorFilter (int color, PorterDuff.Mode mode)

为图片设置着色选项。

参数

color        应用的着色颜色。

mode       如何着色。标准模式为 SRC_ATOP。

相关 XML 属性

    android:tint

 

         (17)public void setImageBitmap (Bitmap bm)

设置位图做为该 ImageView 的内容。

参数

bm 设置的位图。

 

         (18)public void setImageDrawable (Drawable drawable)

设置可绘制对象为该 ImageView 显示的内容。

参数

drawable         设置的可绘制对象。

 

         (19)public void setImageLevel (int level)

设置图片的等级,当图片来自于 LevelListDrawable 时。(译者注:使用参见这里

参数

level         图片的新的等级。

 

(20)public void setImageMatrix (Matrix matrix)

         (译者注:矩阵变换)

 

        (21) public void setImageResource (int resId)

经过资源ID设置可绘制对象为该 ImageView 显示的内容。

注意:该操做读取位图,并在 UI 线程中解码,所以可能致使反应迟缓。 若是反应迟缓,能够考虑用 setImageDrawable(Drawable)、 setImageBitmap(Bitmap) 或者 BitmapFactory 代替。

参数

resId        可绘制对象的资源标识。

相关 XML 属性

               android:src

 

         (21)public void setImageState (int[] state, boolean merge)

         (译者注:设置视图的可见和不可见,使用参见这里

 

         (22)public void setImageURI (Uri uri)

设置指定的 URI 为该 ImageView 显示的内容。

注意:该操做读取位图,并在 UI 线程中解码,所以可能致使反应迟缓。 若是反应迟缓,能够考虑用 setImageDrawable(Drawable)、 setImageBitmap(Bitmap) 或者 BitmapFactory 代替。

参数

uri   图像的 URI。

 

(23)public void setMaxHeight (int maxHeight)

用于设置该视图支持的最大高度的可选参数。只有 setAdjustViewBounds(boolean) 为真时有效。要设置图像最大尺寸为 100×100,并保持原始比率,作法以下:

1)         设置 adjustViewBounds 为真;

2)         设置 maxWidth 和 maxHeight 为 100;

3)         设置宽、高的布局参数为 WRAP_CONTENT。

注意,若是原始图像较小,即便设置了该参数,图像仍然要比 100×100 小。若是要设置图片为 固定大小,须要在布局参数中指定大小,并使用 setScaleType(ImageView.ScaleType) 函数来检测,如何 将其调整到适当的大小。

参数

maxHeight      该视图的最大高度。

相关 XML 属性

    android:maxHeight

 

         (24)public void setMaxWidth (int maxWidth)

用于设置该视图支持的最大宽度的可选参数。只有 setAdjustViewBounds(boolean) 为真时有效。要设置图像最大尺寸为 100×100,并保持原始比率,作法以下:

4)         设置 adjustViewBounds 为真;

5)         设置 maxWidth 和 maxHeight 为 100;

6)         设置宽、高的布局参数为 WRAP_CONTENT。

注意,若是原始图像较小,即便设置了该参数,图像仍然要比 100×100 小。若是要设置图片为 固定大小,须要在布局参数中指定大小,并使用 setScaleType(ImageView.ScaleType) 函数来检测,如何 将其调整到适当的大小。

参数

maxWidth       该视图的最大宽度。

相关 XML 属性

                            android:maxWidth

 

(25)public void setScaleType (ImageView.ScaleType scaleType)

控制图像应该如何缩放和移动,以使图像与 ImageView 一致。

参数

scaleType        须要的缩放方式。

相关 XML 属性

    android:scaleType

 

(26)public void setSelected (boolean selected)

改变视图的选中状态。视图有选中和未选中两个状态。注意,选择状态不一样于焦点。 典型的选中的视图是象 ListView 和 GridView 这样的 AdapterView 中显示的 内容;选中的内容会显示为高亮。

参数

selected           为真,将视图设为选中状态;不然为假。

 

受保护方法

(27)protected void drawableStateChanged ()

在视图状态的变化影响到所显示可绘制对象的状态时调用该方法。

覆盖该方法时,要确保调用了父类的该方法。

 

(28)protected void onDraw (Canvas canvas)

实现该方法,用于本身绘制内容。

参数

canvas    用于绘制背景的画布。

 

(29)protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

评估视图及其内容,以决定其宽度和高度.此方法由 measure(int, int) 调用,子类能够重载以提供更精确、更有效率的衡量其内容尺寸的方法。

约定: 覆盖该方法时,必须调用 setMeasuredDimension(int, int) 方法来保存评估结果的视图的宽度和高度.若是忘记将致使 measure(int, int) 方法抛出IllegalStateException异常。要有效的利用父类的 onMeasure(int, int)方法。

基类测量的是背景的大小,除非 MeasureSpec 容许超过背景.子类应该重写 onMeasure(int, int) 方法,觉得其内容提供更适合的大小。

若是重写了该方法,子类要确保其高度和宽度大于等于视图的最小高度和宽度. (getSuggestedMinimumHeight() 和 getSuggestedMinimumWidth())

参数

widthMeasureSpec         父视图要求的横向空间大小.该要求由 View.MeasureSpec 进行了编码处理。

heightMeasureSpec        父视图要求的纵向空间大小.该要求由 View.MeasureSpec 进行了编码处理。

 

(30)protected boolean onSetAlpha (int alpha)

透明度改变时执行。子类可使用该方法指定透明度值,而后返回真; 在调用 onDraw() 时,使用该透明度值。若是返回假,则先在不可见的缓存中绘制视图, 完成该请求;看起来不错,可是可能相对于在子类中绘制要慢。默认实现返回假。

参数

alpha       应用到视图的透明度值 (0…255)。

返回值

    若是该类能够绘制该阿尔法值返回真。

 

(31)protected boolean setFrame (int l, int t, int r, int b)

为视图指定大小和位置。 该方法有布局调用。

参数

l       左侧位置,相对于父容器。

t      顶部位置,相对于父容器。

r      右侧位置,相对于父容器。

b      底部位置,相对于父容器。

返回值

             true 若是新的大小和位置与以前的不一样,返回真。

 

(32)protected boolean verifyDrawable (Drawable dr)

若是你的视图子类显示本身的可绘制对象,他应该重写此方法并为本身的每一个可绘制对象返回真。该函数容许为这些可绘制对象准备动画效果。

重写此方法时,要保证调用其父类的该方法。

参数

dr    待校验的可绘制对象.若是是你显示的对象之一,返回真;不然返回调用父类的返回值。

返回值

boolean 若是可绘制对象已经显示在视图上了,返回真;不然返回假,不容许动画效果。

 

 

 

 

21.4 ImageView的使用

若是如今咱们要显示一张图片,并动态更新它的透明度alpha,效果以下图所示

 

则咱们首先要在XML文件中声明一个ImageView和一个TextView :

<ImageView

    android:id="@+id/ImageView01"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    >

</ImageView>

<TextView

    android:id="@+id/TextView01"

    android:layout_below="@id/ImageView01"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    >

</TextView>

 

 

而后在Activity中设置显示ImageView:

isrung     = true;

      

       //得到ImageView的对象

       imageview = (ImageView) this.findViewById(R.id.ImageView01);

       textview = (TextView) this.findViewById(R.id.TextView01);

      

       //设置imageview的图片资源。一样能够再xml布局中像下面这样写

       //android:src="@drawable/logo"

       imageview.setImageResource(R.drawable.imag2);

      

       //设置imageview的Alpha值

       imageview.setAlpha(image_alpha);

 

以后就须要用一个线程来实时更新alpha:

//开启一个线程来让Alpha值递减

       new Thread(new Runnable() {

           public void run()

           {

              while (isrung)

              {

                  try

                  {

 

                     Thread.sleep(200);

                     //更新Alpha值

                     updateAlpha();

                  }

                  catch (InterruptedException e)

                  {

                     e.printStackTrace();

                  }

              }

 

           }

       }).start();

 

       //接受消息以后更新imageview视图

       mHandler = new Handler() {

           @Override

           public void handleMessage(Message msg)

           {

              super.handleMessage(msg);

              imageview.setAlpha(image_alpha);

              textview.setText("如今alpha值是:"+Integer.toString(image_alpha));

              //更新

              imageview.invalidate();

           }

       };

    }

   

    public void updateAlpha()

    {

       if (image_alpha - 7 >= 0)

       {

           image_alpha -= 7;

       }

       else

       {

           image_alpha = 0;

           isrung = false;

       }

       //发送须要更新imageview视图的消息

       mHandler.sendMessage(mHandler.obtainMessage());

    }

21.5 补充

补充

         文章精选

                   Android ImageView 加边框

                   Android用ImageView显示本地和网上的图片

                   imageView动画效果

 

22 Gallery拖动效果

22. 1 Gallery类的层次关系

Gallery是一个锁定中心条目而且拥有水平滚动列表的视图。

Gallery(画廊)使用Theme_galleryItemBackground做为Gallery(画廊)适配器中的各视图的默认参数。若是你没有设置,你就须要调整一些Gallery(画廊)的属性,好比间距。

Gallery(画廊)中的视图应该使用Gallery.LayoutParams做为它们的布局参数类型。

参见Gallery tutorial

 

内部类

class                   Gallery.LayoutParams

Gallery(画廊)扩展了LayoutParams,以此提供能够容纳当前的转换信息和先前的位置转换信息的场所。

Galery是一个实现图片拖动的很是炫的一个效果,Gallery类的层次关系以下:

结构

继承关系

         public class Gallery extends AbsSpinner

implements GestureDetector.OnGestureListener

 

java.lang.Object

   android.view.View

           android.view.ViewGroup

                   android.widget.AdapterView<T extends android.widget.Adapter>

                           android.widget.AbsSpinner

                                   android.widget.Gallery

22.2 Gallery的XML 属性

 XML属性

 

属性名称

描述

android:animationDuration

设置布局变化时动画的转换所需的时间(毫秒级)。仅在动画开始时计时。该值必须是整数,好比:100。

android:gravity

 指定在对象的X和Y轴上如何放置内容。指定一下常量中的一个或多个(使用 “|”分割)

Constant

Value

Description

top

0x30

紧靠容器顶端,不改变其大小

bottom

0x50

紧靠容器底部,不改变其大小

left

0x03

紧靠容器左侧,不改变其大小

right

0x05

紧靠容器右侧,不改变其大小

center_vertical

0x10

垂直居中,不改变其大小

fill_vertical

0x70

垂直方向上拉伸至充满容器

center_horizontal

0x01

水平居中,不改变其大小

Fill_horizontal

0x07

水平方向上拉伸使其充满容器

center

0x11

居中对齐,不改变其大小

fill

0x77

在水平和垂直方向上拉伸,使其充满容器

clip_vertical

0x80

垂直剪切(当对象边缘超出容器的时候,将上下边缘超出的部分剪切掉)

clip_horizontal

0x08

水平剪切(当对象边缘超出容器的时候,将左右边缘超出的部分剪切掉)

 

android:spacing

(译者注:设置图片之间的间距)

android:unselectedAlpha

 设置未选中的条目的透明度(Alpha)。该值必须是float类型,好比:“1.2”。

 

 

22.3 Gallery类的经常使用方法

公共方法

(1)public boolean dispatchKeyEvent (KeyEvent event)

         在焦点路径上分发按钮事件到下一个视图。该路径从视图树的顶端遍历到当前得到焦点的视图。若是当前视图已得到焦点,就分发给自身。不然,就分发到下一个节点的焦点路径上。该方法监放任何按钮事件。

参数

                            event        被分发的按钮事件

                   返回值

                            boolean    时间被处理返回true,不然false

 

(2)public void dispatchSetSelected (boolean selected)

分发setSelected给视图的子类。

参数

selected   新选中的状态

 

(4)public ViewGroup.LayoutParams generateLayoutParams (AttributeSet attrs)

返回一个新的已设置属性集合的布局参数。

参数

attrs                   用于生成布局参数的属性集合

返回值

一个ViewGroup.LayoutParams实例或者它的子类

        

(5)public boolean onDown (MotionEvent e)

当轻击和按下手势事件发生时通知该方法。任何按下事件都会直接触发该方法。全部其余的事件都要先于该方法。

参数

e       按下动做事件

 

(6)public boolean onFling (MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)

当初始化的按下动做事件和松开动做事件匹配时通知fling(译者注:快滑,用户按下触摸屏、快速移动后松开)事件。该动做的速度经过计算X和Y轴上每秒移动多少像素得来。

参数

e1     致使开始fling的按下动做事件。

e2     触发当前onFling方法的移动动做事件

velocityX  测量fling沿X轴上的速度,像素/每秒

velocityY  测量fling沿Y轴上的速度,像素/每秒

返回值

若是该事件被消耗返回true,不然false。

 

(7)public boolean onKeyDown (int keyCode, KeyEvent event)

处理左,右和点击事件

参数

keyCode   表明按下按钮的按键码,来自KeyEvent

event        定义按钮动做的KeyEvent对象。

返回值

若是已经处理了按钮事件,则返回true。若是你想让下一个事件接收者处理,就返回false

参见

onKeyDown(int, KeyEvent)

 

(8)public boolean onKeyUp (int keyCode, KeyEvent event)

KeyEvent.Callback.onKeyMultiple()方法的默认实现:当KEYCODE_DPAD_CENTER 或者 KEYCODE_ENTER被释放时,执行点击视图操做。

参数

keyCode   表明按下按钮的按键码,来自KeyEvent

event        定义按钮动做的KeyEvent对象。

返回值

若是已经处理了按钮事件,则返回true。若是你想让下一个事件接收者处理,就返回false

 

(9)public void onLongPress (MotionEvent e)

MotionEvent初始化并按下触发长按并通知本方法

参数

e       致使开始长按的初始按下动做事件。

 

 

(10)public boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)

当初始按下动做事件和当前移动动做事件致使滚动时通知本方法。为了方便提供了X和Y轴上的距离。

监听屏幕滚动事件。为了方便提供了X和Y轴上的距离。

参数

e1   致使滚动开始按下的动做事件。

e2   触发当前onScroll方法的移动动做事件。

distanceX        距离是自上一次调用onScroll方法在X轴上的距离。不是e1 和e2之间的距离。

distanceY        距离是自上一次调用onScroll方法在Y轴上的距离。不是e1 和e2之间的距离。

返回值

若是该事件被消耗返回true不然false

 

(11)public void onShowPress (MotionEvent e)

用户已经执行按下动做尚未执行移动或者弹起动做。该事件常经过高亮一个元素来向用户提供一个视觉反馈即用户的操做已经被辨识了。

参数

e       按下动做事件

 

(12)public boolean onSingleTapUp (MotionEvent e)

在轻击动做和up动做事件触发时通知本方法。(译者注:点击屏幕上的某项的执行流程  有两种状况,一种是时间很短,一种时间稍长:时间很短:onDown--->onSingleTapUp--->onSingleTapConfirmed,见这里1这里2。)

参数

e       完成开始轻击的up动做事件

返回值

若是该事件被消耗返回true不然false

 

(13)public boolean onTouchEvent (MotionEvent event)

实现该方法来处理触摸屏动做事件

参数

event        动做事件

返回值

若是该事件被消耗返回true不然false

 

(14)public void setAnimationDuration (int animationDurationMillis)

设置当子视图改变位置时动画转换时间。仅限于动画开始时生效。

参数

animationDurationMillis          动画转换时间(毫秒级)

        

(15)public void setCallbackDuringFling (boolean shouldCallback)

当flinged时是否回调每个getOnItemSelectedListener()。若是设为false,只回调最终选中的项。若是为true,则全部的项都会回调。

参数

shouldCallback         设置抛滑的过程当中是否回调

 

(16)public void setGravity (int gravity)

描述子视图的对齐方式。

 

(17)public void setSpacing (int spacing)

设置Gallery中项的间距

参数

spacing    Gallery中项的间距,以像素为单位

 

(18)public void setUnselectedAlpha (float unselectedAlpha)

设置Gallery中未选中项的透明度(alpha)值。

参数

unselectedAlpha      未选中项的透明度(alpha)值

 

(19)public boolean showContextMenu ()

显示该视图上下文菜单。

返回值

上下文菜单是否显示。

 

(20)public boolean showContextMenuForChild (View originalView)

为指定的视图或者其父类显示上下文菜单。

大部分状况下,子类不须要重写该方法。可是,若是子类被直接添加到窗口管理器(例如:addView(View.android.view.ViewGroup.LayoutParams)),此时就须要重写来显示上下文菜单

参数

originalView    上下文菜单初次调用的源视图

返回值

若是上下文菜单被显示了 则返回true。

 

受保护方法

(21)protected int computeHorizontalScrollExtent ()

在水平范围内计算滚动条滑块的滚动范围。该值用来计算滚动条滑块的长度。

该范围可使用任意的单位可是必须跟computeHorizontalScrollRange()computeHorizontalScrollOffset()的单位保持一致。

默认范围是视图的宽度。

返回值

滚动条滑块的水平滚动范围

 

(22)protected int computeHorizontalScrollOffset ()

在水平范围内计算滚动条滑块的偏移量。该值用来计算水平滑块的位置。

该范围可使用任意的单位可是必须跟computeHorizontalScrollRange()computeHorizontalScrollExtent()的单位保持一致。

默认偏移量是视图的偏移量。

返回值

滚动条滑块的水平偏移量。

 

(23)protected int computeHorizontalScrollRange ()

计算滚动条水平方向上的滚动范围。

该范围可使用任意的单位可是必须跟computeHorizontalScrollExtent()computeHorizontalScrollOffset()的单位保持一致。

返回值

水平滚动条表明的滑动总范围。

 

(24)protected void dispatchSetPressed (boolean pressed)

分发 setPressed到View的子类。

参数

                            pressed    新按下的状态

 

(25)protected ViewGroup.LayoutParams generateDefaultLayoutParams ()

返回默认的布局参数。当View做为参数传递给addView(View)而没有布局参数时就会请求这些参数。若是返回null,则addView会抛出异常。

返回值

默认的布局参数或null

 

(26)protected ViewGroup.LayoutParams generateLayoutParams (ViewGroup.LayoutParams p)

返回一组合法的受支持的布局参数。当把ViewGroup传递给View而该View的布局参数并无经过checkLayoutParams(android.view.ViewGroup.LayoutParams)的测试时,就会调用该方法。该方法应该返回一组适合该ViewGroup的新的布局参数,该过程可能须要从指定的一组布局参数中复制相关的属性。

参数

p       被转换成适合该ViewGroup的一组参数。

返回值

返回一个ViewGroup.LayoutParams的实例或者一个它的子类。

 

(27)protected int getChildDrawingOrder (int childCount, int i)

返回迭代的绘制子类索引。若是你想改变子类的绘制顺序就要重写该方法。默认返回 i 值。

提示:为了可以调用该方法,你必须首先调用setChildrenDrawingOrderEnabled(boolean)来容许子类排序。

参数

         childCount        子类个数

i        当前迭代顺序

返回值

绘制该迭代子类的索引

 

(28)protected boolean getChildStaticTransformation (View child, Transformation t)

(译者注:setStaticTransformationsEnabled这个属性设成true的时候每次viewGroup(看Gallery的源码就能够看到它是从ViewGroup间接继承过来的)在从新画它的child的时候都会促发getChildStaticTransformation这个函数。这里1这里2

 

(29)protected ContextMenu.ContextMenuInfo getContextMenuInfo ()

Views若是有额外的信息跟上下文菜单有联系的话就须要实现该方法。返回的结果被用做回调方法onCreateContextMenu(ContextMenu, View, ContextMenuInfo)的参数。

返回值

显示上下文菜单的条目的额外信息。这些信息将会改变View不一样的子类

 

(30)protected void onFocusChanged (boolean gainFocus, int direction, Rect previouslyFocusedRect)

当该视图的焦点状态发生改变时将会调用视图系统。当导向的方向触发焦点事件时,方向和先前得到焦点的矩形提供焦点事件的来源。当用户重写该方法,必须调用父类方法来触发标准的焦点处理事件。

参数

gainFocus                   若是View得到焦点为true,不然false

direction         当调用requestFocus()方法来给该视图焦点时焦点的移动方向。该值:FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT 或 FOCUS_RIGHT。该参数不经常使用,一般使用它的默认值。

previouslyFocusedRect    该视图坐标系统中先前得到焦点的视图的矩形。若是适用,这将得到焦点事件来源的更细致的信息(除了方向之外)。不然为null。

 

(31)protected void onLayout (boolean changed, int l, int t, int r, int b)

当视图为每个子类分配大小和位置时从布局中调用该方法。有子类的派生类应该重写该方法在子类中调用布局。

参数

changed   该视图新的大小和位置。

l        相对父容器的左侧位置

t        相对父容器的顶部位置

r        相对父容器的右侧位置

b       相对父容器的底部位置

 

22.4 Gallery的使用

在XML中声明一个Gallery:

main.xml

           <?xml version="1.0" encoding="utf-8"?>

<Gallery xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gallery"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:gravity="center_vertical"

        android:background="?android:galleryItemBackground"

        />

而后须要声明一个存放图片的容器ImageAdapter,以后就能够经过setAdapter方法把资源添加到Gallery中来显示,并设置好监听事件处理:

 

        gallery = (Gallery)findViewById(R.id.gallery);

       gallery.setAdapter(new ImageAdapter(this));//设置图片适配器

        //设置监听器

        gallery.setOnItemClickListener(new OnItemClickListener() {

         @Override

         public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  long arg3) {

            Toast.makeText(MyGallery.this, "点击了第"+arg2+"张图片", Toast.LENGTH_LONG).show();

         }

     });

    }

}

 

 声明一个存放图片的容器ImageAdapter:

 

class ImageAdapter extends BaseAdapter{

  private Context context;

  //图片源数组

  private Integer[] imageInteger={

         R.drawable.gallery_photo_1,

         R.drawable.gallery_photo_2,

         R.drawable.gallery_photo_3,

         R.drawable.gallery_photo_4,

         R.drawable.gallery_photo_5,

         R.drawable.gallery_photo_6,

         R.drawable.gallery_photo_7,

         R.drawable.gallery_photo_8

  };

  public ImageAdapter(Context c){

     context = c;

  }

  @Override

  public int getCount() {

     return imageInteger.length;

  }

  @Override

  public Object getItem(int position) {

     return position;

  }

  @Override

  public long getItemId(int position) {

     // TODO Auto-generated method stub

     return position;

  }

  @Override

  public View getView(int position, View convertView, ViewGroup parent) {

     ImageView imageView = new ImageView(context);

     imageView.setImageResource(imageInteger[position]);

     imageView.setScaleType(ImageView.ScaleType.FIT_XY);

     imageView.setLayoutParams(new Gallery.LayoutParams(136, 88));

     return imageView;

  }}

 

22.5 补充

补充

文章精选

         Android开发——使用Gallery实现“多级联动”

         android 图片拖动效果(Gallery)

 

23 ImageSwitcher切换图片

23.1 ImageSwitcher类概述

ImageSwitcher是Android中控制图片展现效果的一个控件,如:幻灯片效果...,很有感受啊,作相册一绝。

 

ImageSwitcher类的层次关系以下:

public class ImageSwitcher extends ViewSwitcher

 

java.lang.Object

android.view.View

     android.view.ViewGroup

    android.widget.FrameLayout

     android.widget.ViewAnimator

      android.widget.ViewSwitcher                        android.widget.ImageSwitcher

 

23.2 ImageSwitcher经常使用的方法

方法

功能描述

返回值

ImageSwitcher

两个构造方法:

ImageSwitcher(Context contex)

ImageSwitcher(Contex contex,AttributeSet attrs)

null

setImageDrawable(Drawable drawable)

设置图片为参数drawable指定的资源

void

setImageResource(int resid)

设置图片为参数resid所指定的资源。resid是编译器为资源生成惟一标识,例如R.id.pcil

void

setInAnimation(Context context,in id)

设置图片进入屏幕时所显示的动画

void

setOutAnimation(Context context,in id)

设置图片退出屏幕时,所显示的动画

void

setImageURI(Uri uri)

设置图片为参数uri(例如一个图片的web连接)所指定的资源

void

addView(View child,int index,ViewGroup.LayoutParams params)

继承自ViewSwitcher的方法,用于添加视图。child是要添加的视图,params是视图的布局

View

getNextView()

继承自ViewSwitcher的方法,用于获取视图

 

getCurrentView()

继承自ViewAnimator的方法,用于获取视图

View

getDisplayedChild();

当前显示的子视图的索引

int

removeAllViews()

继承在ViewAnimator的方法,用于移除全部的子视图

void

removeViewAt(int index)

继承自ViewAnimator的方法,用于移除index所指定的视图

void

setAnimateFirstView(boolean animate)

继承自ViewAnimator的方法,用于设置视图是否在首次显示时播放动画

void

removeViews(int start,int count)

继承自ViewAnimator的方法,用于移除自start的count个子视图

void

showNext()

继承自ViewAnimator的方法,因为显示下一张图片

void

  

 

23.3 ImageSwitcher的使用

咱们直接在Activity中实现,继承监听OnClickListenner和ViewFactory接口:
public class ImageSwitcherActivity extends Activity implements OnClickListener,ViewFactory

/* 全部要显示的图片资源索引 */

    private static final Integer[] imagelist =

    {

       R.drawable.img1,

       R.drawable.img2,

       R.drawable.img3,

       R.drawable.img4,

       R.drawable.img5,

       R.drawable.img6,

       R.drawable.img7,

       R.drawable.img8,

    };

   

    //建立ImageSwitcher对象

    private ImageSwitcher           m_Switcher;

    //索引

    private static int              index         = 0;

 

    //“下一页”按钮ID

    private static final int    BUTTON_DWON_ID    = 0x123456;

    //“上一页”按钮ID

    private static final int    BUTTON_UP_ID  = 0x123457;

    //ImageSwitcher对象的ID

    private static final int    SWITCHER_ID       = 0x123458;

 

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState)

    {

       super.onCreate(savedInstanceState);

 

       //建立一个线性布局LinearLayout

       LinearLayout main_view = new LinearLayout(this);

       //建立ImageSwitcher对象

       m_Switcher = new ImageSwitcher(this);

       //在线性布局中添加ImageSwitcher视图

       main_view.addView(m_Switcher);

       //设置ImageSwitcher对象的ID

       m_Switcher.setId(SWITCHER_ID);

       //设置ImageSwitcher对象的数据源

       m_Switcher.setFactory(this);

       m_Switcher.setImageResource(imagelist[index]);

      

       //设置显示上面建立的线性布局

       setContentView(main_view);

 

       //建立“下一张”按钮

       Button next = new Button(this);

       next.setId(BUTTON_DWON_ID);

       next.setText("下一张");

       next.setOnClickListener(this);

       LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(100, 100);

       main_view.addView(next, param);

 

       //建立“上一张”按钮

       Button pre = new Button(this);

       pre.setId(BUTTON_UP_ID);

       pre.setText("上一张");

       pre.setOnClickListener(this);

       main_view.addView(pre, param);

 

    }

 

    //事件监听、处理

    public void onClick(View v)

    {

       switch (v.getId())

       {

           //下一页

           case BUTTON_DWON_ID:

               index++;

              if (index >= imagelist.length)

              {

                  index = 0;

              }

              //ImageSwitcher对象资源索引

              m_Switcher.setImageResource(imagelist[index]);

              break;

           //上一页

           case BUTTON_UP_ID:

              index--;

              if (index < 0)

              {

                  index = imagelist.length - 1;

              }

              //ImageSwitcher对象资源索引

              m_Switcher.setImageResource(imagelist[index]);

              break;

           default:

              break;

       }

    }

 

    public View makeView()

    {

       //将全部图片经过ImageView来显示

       return new ImageView(this);

    }

实现的效果以下所示:

 

23.4 补充资料

补充

         文章连接

                   Android ImageSwitcher

                   Image Switcher View | Android Developer Tutorial

 

24 GridView网络视图

24.1 GridView类概述

GridView是一个在平面上可显示多个条目的可滚动的视图组件,该组件中的条目经过一个ListAdapter和该组件进行关联。好比android手机中显示的应用:

 

GridView类的层次关系以下:

public final class GridView extends AbsListView

 

java.lang.Object

android.view.View

    android.view.ViewGroup

android.widget.AdapterView<T extends android.widget.Adapter>

                android.widget.AbsListView

                    android.widget.GridView

24.2 GridView经常使用属性

XML属性

属性名称

描述

android:columnWidth

设置列的宽度。关联的方法为:setColumnWidth(int)

android:gravity

设置此组件中的内容在组件中的位置。可选的值有:top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical 能够多选,用“|”分开。关联方法:setGravity (int gravity)

android:horizontalSpacing

两列之间的间距。关联方法:setHorizontalSpacing(int)

android:numColumns

列数。关联方法:setNumColumns(int)

android:stretchMode

缩放模式。关联方法:setStretchMode(int)

android:verticalSpacing

两行之间的间距。关联方法:setVerticalSpacing(int)

 

24.3 GridView经常使用的方法

构造函数

         (1)public GridView (Context context)

         建立一个默认属性的GridView实例

public GridView (Context context, AttributeSet attrs)

建立一个带有attrs属性的GridView实例

(2)public GridView (Context context, AttributeSet attrs, int defStyle)

建立一个带有attrs属性,而且指定其默认样式的GridView实例

公共方法

         (3)public ListAdapter getAdapter ()

得到与此组件相关的适配器..

返回值

    ListAdapter适配器实例

        

         (4)public int getStretchMode ()

得到GridView的缩放模式..

 

         (5)public boolean onKeyDown (int keyCode, KeyEvent event)

默认由KeyEvent.Callback.onKeyMultiple()实现,若是视图是可用的而且是可点击的,那么传入KEYCODE_DPAD_CENTER或KEYCODE_ENTER值是执行的是按下视图操做。

       参数

              keyCode  一个表示按下操做的键值.

event  表示按钮事件的对象. 

                  返回值

若是你认为已经完成事件处理,不想让让下一个处理器来处理此事件,则返回true,不然返回false。

 

         (6)public boolean onKeyMultiple (int keyCode, int repeatCount, KeyEvent event)

默认由KeyEvent.Callback.onKeyMultiple()实现,老是返回false(不处理此事件)。

         参数

                   keyCode  键值.

repeatCount  该动做发生的次数.

event  事件对象. 

                  返回值

若是你认为已经完成事件处理,不想让让下一个处理器来处理此事件,则返回true,不然返回false。

 

         (7)public boolean onKeyUp (int keyCode, KeyEvent event)

默认由KeyEvent.Callback.onKeyMultiple()实现,若是视图是可用的而且是可点击的,那么传入KEYCODE_DPAD_CENTER或KEYCODE_ENTER值是执行的是点击视图操做。

参数

              keyCode  键值.

event  事件对象.

                  返回值

若是你认为已经完成事件处理,不想让让下一个处理器来处理此事件,则返回true,不然返回false。

 

         (8)public void setAdapter (ListAdapter adapter)

设置GridView的数据。

                  参数

                            adapter  为grid提供数据的适配器 

 

         (9)public void setColumnWidth (int columnWidth)

设置GridView的列宽.

                  参数

                            columnWidth  列的宽度,以像素为单位

 

         (10)public void setGravity (int gravity)

设置控件内容的位置,默认值为:Gravity.LEFT.

                  参数

                            gravity  位置值

 

         (11)public void setHorizontalSpacing (int horizontalSpacing)

设置列间距.

                  参数

                            horizontalSpacing  列间距值

 

(12)public void setNumColumns (int numColumns)

         设置grid的列数

参数

numColumns  列数值.

 

(13)public void setSelection (int position)

         设置选中的条目.

参数

position  数据条目在列表中的索引值(从0开始),若是在可触摸的模式下,在该索引值下的条目将不会被选中,可是该索引值仍然指向该条目。

 

(14)public void setStretchMode (int stretchMode)

设置grid中的条目以什么缩放模式去填充空间。.

参数

stretchMode  可选值:NO_STRETCH,STRETCH_SPACING,STRETCH_SPACING_UNIFORM,或STRETCH_COLUMN_WIDTH

 

(15)public void setVerticalSpacing (int verticalSpacing)

设置行间距.

参数

verticalSpacing  间距值,以像素为单位..

 

24.4 GridView的简单使用

如今要实现以下图所示的效果:

 

咱们声明两个xml文件,一个是gridview.xml 声明一个GridView:

gridview.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

   android:layout_width="wrap_content"

   android:layout_height="wrap_content">

   <GridView android:id="@+id/mygridview"

      android:numColumns="3"

      android:gravity="center_horizontal"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content">

   </GridView>

</LinearLayout>

 

一个是Grid_item.xml,包含要显示的一个ImageView和一个TextView

grid_item.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout android:id="@+id/RelativeLayout01"

   android:layout_width="fill_parent" android:layout_height="fill_parent"

   xmlns:android="http://schemas.android.com/apk/res/android">

   <ImageView android:id="@+id/image_item"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content">

   </ImageView>

   <TextView android:id="@+id/text_item"

      android:layout_below="@+id/image_item"

      android:layout_height="wrap_content"

      android:layout_width="wrap_content">

   </TextView>

</RelativeLayout>

 

而后在Activity 中就能够实现显示了:

 

//准备要添加的数据条目

      List<Map<String, Object>> items = new ArrayList<Map<String,Object>>();

      for (int i = 0; i < 10; i++) {

        Map<String, Object> item = new HashMap<String, Object>();

        item.put("imageItem", R.drawable.icon);

        item.put("textItem", "text" + i);

        items.add(item);

      }

//实例化一个适配器

      SimpleAdapter adapter = new SimpleAdapter(this, items, R.layout.grid_item, new String[]{"imageItem", "textItem"}, new int[]{R.id.image_item, R.id.text_item});

      //得到GridView实例

      gridview = (GridView)findViewById(R.id.mygridview);

      //gridview.setNumColumns(3);//能够在xml中设置

      //gridview.setGravity(Gravity.CENTER);//同上

//将GridView和数据适配器关联

      gridview.setAdapter(adapter);

 

25 ScrollView卷轴视图

25.1 ScrollView类概述

ScrollView是一种可供用户滚动的层次结构布局容器,容许显示比实际多的内容。ScrollView是一种FrameLayout,意味须要在其上放置有本身滚动内容的子元素。子元素能够是一个复杂的对象的布局管理器。一般用的子元素是垂直方向的LinearLayout,显示在最上层的垂直方向可让用户滚动的箭头。

TextView类也有本身的滚动功能,因此不须要使用ScrollView,可是只有两个结合使用,才能保证显示较多内容时候的效率。但只有二者结合使用才能够实如今一个较大的容器中一个文本视图效果。

ScrollView只支持垂直方向的滚动。

ScrollView类的结构以下:

继承关系

public class ScrollView extends FrameLayout

        

java.lang.Object

android.view.View

         android.view.ViewGroup

                   android.widget.FrameLayout

                            android.widget.ScrollView

 

25.2 ScrollView经常使用的方法

构造函数

(1)public ScrollView (Context context)

建立一个默认属性的ScrollView实例。

 

(2)public ScrollView (Context context, AttributeSet attrs)

建立一个带有attrs属性的ScrollView 实例。

 

(3)public ScrollView (Context context, AttributeSet attrs, int defStyle)

建立一个带有attrs属性,而且指定其默认样式的ScrollView实例。

 

公共方法

(4)public void addView (View child)

       添加子视图。若是事先没有给子视图设置layout参数,会采用当前ViewGroup的默认参数来设置子视图。

              参数

                     child       所添加的子视图

 

(5)public void addView (View child, int index)

添加子视图。若是事先没有给子视图设置layout参数,会采用当前ViewGroup的默认参数来设置子视图。

参数

child       所添加的子视图

             index      添加子视图的位置

        

(6)public void addView (View child, int index, ViewGroup.LayoutParams params)

根据指定的layout参数添加子视图

参数

             child       所添加的子视图

             index      添加子视图的位置

             params   为子视图设置的layout参数

 

(7)public void addView (View child, ViewGroup.LayoutParams params)

根据指定的layout参数添加子视图。

参数

             child       所添加的子视图

             params   为子视图设置的layout参数

 

(8)public boolean arrowScroll (int direction)

响应点击上下箭头时对滚动条滚动的处理。

              参数

                     direction        按下的箭头所对应的方向

返回值

若是咱们处理(消耗)了此事件返回true,不然返回false。

 

(9) public void computeScroll ()

被父视图调用,用于必要时候对其子视图的值(mScrollX和mScrollY)进行更新。典型的状况如:父视图中某个子视图使用一个Scroller对象来实现滚动操做,会使得此方法被调用。

 

(10)public boolean dispatchKeyEvent (KeyEvent event)

       发送一个key事件给当前焦点路径的下一个视图。此焦点路径从视图树的顶层执行直到当前焦点视图。若是此视图为焦点视图,将为本身发送。不然,会为当前焦点路径的下一个节点发送。此方法也会激起一个key监听器。

参数

                     event     发送的key事件

返回值

事件被处理返回true,不然返回false。

 

(11)public void draw (Canvas canvas)

手动绘制视图(及其子视图)到指定的画布(Canvas)。这个视图必须在调用这个函数以前作好了总体布局。当实现一个视图时,不须要继承这个方法;相反,你应该实现onDraw(Canvas)方法。

参数

canvas    绘制视图的画布

 

(12)public boolean executeKeyEvent (KeyEvent event)

当接收到key事件时,用户能够调用此函数来使滚动视图执行滚动,相似于处理由视图体系发送的事件。

参数

event     须要执行key的事件

返回值

事件被处理返回true,不然返回false。

 

(13)public void fling (int velocityY)

滚动视图的滑动(fling)手势。(译者注: 如何监听android的屏幕滑动中止事件

参数

                     velocityY      Y方向的初始速率。正值表示手指/光标向屏幕下方滑动,而内容将向上滚动。

 

(14)public boolean fullScroll (int direction)

对响应“home/end”短按时响应滚动处理。此方法将视图滚动到顶部或者底部,而且将焦点置于新的可视区域的最顶部/最底部组件。若没有适合的组件作焦点,当前的ScrollView会收回焦点。

参数

direction滚动方向:FOCUS_UP表示视图向上滚动;FOCUS_DOWN表示视图向下滚动

返回值

若key事件被消耗(consumed)返回true,其余状况返回false。

 

(15)public int getMaxScrollAmount ()

返回值

当前滚动视图响应箭头事件可以滚动的最大数。

 

(16)public boolean isFillViewport ()

指示当前ScrollView的内容是否被拉伸以填充视图可视范围(译者注:viewport可视范围,参见决定Scrollviewer里面Control的可视范围)。

返回值

内容填充视图返回true,不然返回false。

 

(17)public boolean isSmoothScrollingEnabled ()

返回值

             按箭头方向滚动时,是否显示滚动的平滑效果。

 

(18)public boolean onInterceptTouchEvent (MotionEvent ev)

实现此方法是为了拦截全部触摸屏幕时的运动事件。能够像处理发送给子视图的事件同样去监视这些事件,而且获取当前手势在任意点的ownership

使用此方法时候须要注意,由于它与View.onTouchEvent(MotionEvent)有至关复杂的交互,而且前提须要正确执行View.onTouchEvent(MotionEvent)。事件将按照以下顺序接收到:

1.    收到down事件

2.    Down事件或者由视图组的一个子视图处理,或者被用户本身的onTouchEvent()方法处理;此处理意味你应该执行onTouchEvent()时返回true,这样才能继续看到剩下的手势(取代找一个父视图处理)。若是onTouchEvent()返回true时,你不会收到onInterceptTouchEvent()的任何事件而且全部对触摸的处理必须在onTouchEvent()中发生。

3.    若是此方法返回false,接下来的事件(up to and including the final up)将最早被传递当此,而后是目标的onTouchEvent()。

4.    若是返回true,将不会收到如下任何事件:目标view将收到一样的事件可是会伴随ACTION_CANCEL,而且全部的更进一步的事件将会传递到你本身的onTouchEvent()方法中而不会再在这里出现。

参数

             ev          体系向下发送的动做事件

返回值

若是将运动事件从子视图中截获而且经过onTouchEvent()发送到当前ViewGroup ,返回true。当前目标将会收到ACTION_CANCEL事件,而且再也不会有其余消息传递到此。

              (译者注:onInterceptTouchEvent和onTouchEvent调用时序

 

(19)public boolean onTouchEvent (MotionEvent ev)

执行此方法为了处理触摸屏幕的运动事件。

参数

     ev          运动事件

返回值

事件被处理返回true,其它返回false。

 

(20)public boolean pageScroll (int direction)

响应短按“page up/ down”时候对滚动的处理。此方法将向上或者向下滚动一屏,而且将焦点置于新可视区域的最上/最下。若是没有适合的component做为焦点,当前scrollView将收回焦点。

参数

     direction        滚动方向:FOCUS_UP表示向上翻一页,FOCUS_DOWN表示向下翻一页。

返回值

此key事件被消耗(cosumed)返回true,其余返回false。

 

(21)public void requestChildFocus (View child, View focused)

当父视图的一个子视图的要得到焦点时,调用此方法。

参数

     child              要得到焦点的父视图的子视图。此视图包含了焦点视图。若是没有特殊徐要求,此视图实际上就是焦点视图。

              focused        子视图的子孙视图而且此子孙视图是真正的焦点视图

 

(22)public boolean requestChildRectangleOnScreen (View child, Rect rectangle, boolean immediate)

当组里的某个子视图须要被定位在屏幕的某个矩形范围时,调用此方法。重载此方法的ViewGroup可确认如下几点:

    * 子项目将是组里的直系子项

    * 矩形将在子项目的坐标体系中

重载此方法的ViewGroup应该支持如下几点:

    * 若矩形已是可见的,则没有东西会改变

    * 为使矩形区域所有可见,视图将能够被滚动显示

参数

child        发出请求的子视图

rectangle    子项目坐标系内的矩形,即此子项目但愿在屏幕上的定位

immediate   设为true,则禁止动画和平滑移动滚动条

      返回值

            进行了滚动操做的这个组(group),是否处理此操做。

(23)public void requestLayout ()

当有改变引发当前视图从新布局时,调用此函数。它将规划一个视图树的layout路径。

 

(24)public void scrollTo (int x, int y)

设置当前视图滚动到的位置。此函数会引发对onScrollChanged(int, int, int, int)函数的调用而且会让视图更新。

当前版本取消了在子视图中的滚动。

参数

     x     滚动到的X位置

              y     滚动到的Y位置

 

(25)public void setFillViewport (boolean fillViewport)

设置当前滚动视图是否将内容高度拉伸以填充视图可视范围(译者注:viewport可视范围,参见决定Scrollviewer里面Control的可视范围)。

参数

     fillViewport    设置为true表示拉伸内容高度来适应视口边界;其余设为false。

 

(26)public void setOverScrollMode (int mode)

为视图设置over-scroll模式。有效的over-scroll模式有OVER_SCROLL_ALWAYS(缺省值),OVER_SCROLL_IF_CONTENT_SCROLLS(只容许当视图内容大过容器时,进行over-scrolling)和OVER_SCROLL_NEVER。只有当视图能够滚动时,此项设置才起做用。

(译者注:这个函数是2.3 r1 中新增的,API Level 9。关于over-scroll这里译为弹性滚动,即,参见帖子:相似iPhone的弹性ListView滚动

         参数

                   mode       The new over-scroll mode for this view.

 

(27)public void setSmoothScrollingEnabled (boolean smoothScrollingEnabled)

用来设置箭头滚动是否能够引起视图滚动。

参数

              smoothScrollingEnabled    设置箭头滚动是否能够引发内容的滚动的bool值

 

(28)public final void smoothScrollBy (int dx, int dy)

相似于scrollBy(int, int),可是滚动时候是平缓的而不是当即滚动到某处。

参数

     dx   在X方向滚动的像素数

     dy   在Y方向滚动的像素数

 

(29)public final void smoothScrollTo (int x, int y)

相似于scrollTo(int, int),可是滚动时候是平缓的而不是当即滚动到某处。

参数

     x     要滚动到位置的X坐标

              y     要滚动到位置的Y坐标

 

受保护方法

(30)protected int computeScrollDeltaToGetChildRectOnScreen (Rect rect)

计算X方向滚动的总合,以便在屏幕上显示子视图的完整矩形(或者,若矩形宽度超过屏幕宽度,至少要填满第一个屏幕大小)。

参数

     rect        矩形

返回值

滚动差值

 

(31)protected int computeVerticalScrollOffset ()

计算垂直方向滚动条的滑块的偏移。此值用来计算滚动条轨迹的滑块的位置。

范围能够以任意单位表示,可是必须与computeVerticalScrollRange()computeVerticalScrollExtent()的单位一致。

缺省的偏移是在当前视图滚动的偏移。

返回值

滚动条的滑块垂直方向的偏移。

 

(32)protected int computeVerticalScrollRange ()

滚动视图的可滚动范围是全部子元素的高度。

返回值

由垂直方向滚动条表明的全部垂直范围,缺省的范围是当前视图的画图高度。

 

(33)protected float getBottomFadingEdgeStrength ()

返回滚动底部的能见度。能见度的值的范围是0.0(没有消失)到1.0(彻底消失)之间。缺省的执行返回值为0.0或者1.0,而不是他们中间的某个值。滚动时子类须要重载这个方法来提供一个平缓的渐隐的实现。

返回值

滚动底部能见度,值的范围在浮点数0.0f到1.0f之间。

 

(34)protected float getTopFadingEdgeStrength ()

返回滚动顶部的能见度。能见度的值的范围是0.0(没有消失)到1.0(彻底消失)之间。缺省的执行返回值为0.0或者1.0,而不是他们中间的某个值。滚动时子类须要重载这个方法来提供一个平缓的渐隐的实现。

返回值

滚动顶部能见度,值的范围在浮点数0.0f到1.0f之间。

 

(35)protected void measureChild (View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec)

要求当前视图的一个子视图测量本身,同时兼顾到当前视图的MeasureSpec的要求和它的空白。子视图必须有MarginLayoutParams。比较复杂的工做是在getChildMeasureSpec中完成的。

参数

child              须要本身测量的子视图

parentWidthMeasureSpec        当前视图要求的宽度

parentHeightMeasureSpec              当前视图要求的宽度

 

(36)protected void measureChildWithMargins (View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed)

要求当前视图的一个子视图测量本身,同时兼顾到当前视图的MeasureSpec的要求和它的空白和边界。子视图必须有MarginLayoutParams。比较复杂的工做是在getChildMeasureSpec中完成的。

参数

child             须要测量的子视图

parentWidthMeasureSpec       当前视图要求的宽度

widthUsed    水平方向上由父视图使用的空白 (也多是视图的其余子视图使用的)

parentHeightMeasureSpec      当前视图要求的宽度

heightUsed  垂直方向上由父视图使用的空白 (也多是视图的其余子视图使用的)

 

(37)protected void onLayout (boolean changed, int l, int t, int r, int b)

当前视图须要为子视图分配大小和位置时候调用,子类继承必需要重载此方法并调用本身子视图的layout函数。

参数

changed       当前视图的新的大小或者位置

l     相对父视图,左边界位置

t     相对父视图,上边界位置

r     相对父视图,右边界位置

b    相对父视图,下边界位置

 

(38)protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

测量视图以肯定其内容宽度和高度。此方法被measure(int, int)调用。须要被子类重写以提供对其内容准确高效的测量。

约定:当重写此方法时,你必须调用setMeasuredDimension(int, int)来保存当前视图view的宽度和高度。不成功调用此方法将会致使一个IllegalStateException异常,是由measure(int, int)抛出。因此调用父类的onMeasure(int, int)方法是必须的。

父类的实现是以背景大小为默认大小,除非MeasureSpec(测量细则)容许更大的背景。子类能够重写onMeasure(int,int)以对其内容提供更佳的尺寸。

若是此方法被重写,那么子类的责任是确认测量高度和测量宽度要大于视图view的最小宽度和最小高度(getSuggestedMinimumHeight() 和 getSuggestedMinimumWidth()),使用这两个方法能够取得最小宽度和最小高度。

参数

widthMeasureSpec 受主窗口支配的水平空间要求。这个需求经过 View.MeasureSpec.进行编码。

          heightMeasureSpec         受主窗口支配的垂直空间要求。这个需求经过 View.MeasureSpec.进行编码。

 

         (39)protected void onOverScrolled (int scrollX, int scrollY, boolean clampedX, boolean clampedY)

       被overScrollBy(int, int, int, int, int, int, int, int, boolean)调用,来对一个over-scroll操做的结果进行响应。(译者注:这个函数是2.3 r1 中新增的,API Level 9)

参数

scrollX     新的X滚动像素值

scrollY     新的Y滚动像素值

clampedX        当scrollX被over-scroll的边界限制时,值为true

clampedY        当scrollY被over-scroll的边界限制时,值为true

 

(40)protected boolean onRequestFocusInDescendants (int direction, Rect previouslyFocusedRect)

当在滚动视图的子视图中查找焦点视图时,须要注意不要将焦点设置在滚动出屏幕外的控件上。此方法会比执行缺省的ViewGroup代价高,不然此行为也会设置为缺省

参数

             direction 指定下列常量之一:FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT

previouslyFocusedRect  可以给出一个较好的提示的矩形(当前视图的坐标系统)表示焦点从哪里得来。若是没有提示为null。

返回值

是否取得了焦点

 

(41)protected void onSizeChanged (int w, int h, int oldw, int oldh)

布局期间当视图的大小发生改变时调用。若是只是添加到视图,调用时显示的是旧值0。(译者注:也就是添加到视图时,oldw和oldh返回的是0)。

参数

w     视图当前宽度

h     视图当前高度

oldw       视图改变前的宽度

oldh              视图改变前的高度

 

25.3 ScrollView的几个属性

(1)android:scrollbarFadeDuration

设置滚动条淡出效果(从有到慢慢的变淡直至消失)时间,以毫秒为单位。Android2.2中滚动条滚动完以后会消失,再滚动又会出来,在1.五、1.6版本里面会一直显示着。

(2)android:scrollbarSize

设置滚动条的宽度。

(3)android:scrollbarStyle

(4)设置滚动条的风格和位置。设置值:insideOverlay、insideInset、outsideOverlay、outsideInset。这里没有试出太多效果。 

(5)android:scrollbarThumbHorizontal

设置水平滚动条的drawable。     

(6)android:scrollbarThumbVertical

 

设置垂直滚动条的drawable.

(7)android:scrollbarTrackHorizontal

设置水平滚动条背景(轨迹)的色drawable

(8)android:scrollbarTrackVertical

设置垂直滚动条背景(轨迹)的色drawable

(9)android:background

设置背景色/背景图片。能够经过如下两种方法设置背景为透明:"@android:color/transparent"和"@null"。注意TextView默认是透明的,不用写此属性,可是Buttom/ImageButton/ImageView想透明的话就得写这个属性了

 

25.4 ScrollView的使用

ScrollView卷轴视图是指当拥有不少内容,一屏显示不完时,须要经过滚动跳来显示的视图.的使用,所以咱们这里利用动态的增长Button,当一屏显示不完时,就能够看到滚动的效果了。

首先咱们在xml布局中做以下声明,

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"

 android:id="@+id/ScrollView" android:layout_width="fill_parent"

 android:layout_height="wrap_content" android:scrollbars="vertical">

 <LinearLayout android:id="@+id/LinearLayout"

  android:orientation="vertical" android:layout_width="fill_parent"

  android:layout_height="wrap_content">

  <TextView android:id="@+id/TestView" android:layout_width="fill_parent"

   android:layout_height="wrap_content" android:text="TestView0" />

  <Button android:id="@+id/Button" android:text="Button0" android:layout_width="fill_parent"

   android:layout_height="wrap_content"></Button>

 </LinearLayout>

</ScrollView>

 

而后在Activity中实现显示并建立监听:

// 建立一个线性布局

  mLayout = (LinearLayout) this.findViewById(R.id.LinearLayout);

  // 建立一个ScrollView对象

  sView = (ScrollView) this.findViewById(R.id.ScrollView);

  Button mBtn = (Button) this.findViewById(R.id.button_01);

  mBtn.setOnClickListener(mClickListener);// 添加点击事件监听

 }

 

 public boolean onKeyDown(int keyCode, KeyEvent event){

  Button b = (Button) this.getCurrentFocus();

  int count = mLayout.getChildCount();

  Button bm = (Button) mLayout.getChildAt(count-1);

 

  if(keyCode==KeyEvent.KEYCODE_DPAD_UP && b.getId()==R.id.button_01){

   bm.requestFocus();

   return true;

  }else if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN && b.getId()==bm.getId()){

   this.findViewById(R.id.button_01).requestFocus();

   return true;

  }

  return false;

 }

 // Button事件监听,当点击第一个按钮时增长一个button和一个textview

 private Button.OnClickListener mClickListener = new Button.OnClickListener() {

 

  private int index = 1;

 

  @Override

  public void onClick(View v) {

   TextView tView = new TextView(ScrollViewActivity.this);//定义一个TextView

   tView.setText("TextView" + index);//设置TextView的文本信息

   //设置线性布局的属性

   LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(

     LinearLayout.LayoutParams.FILL_PARENT,

     LinearLayout.LayoutParams.WRAP_CONTENT);

   mLayout.addView(tView, params);//添加一个TextView控件

   Button button = new Button(ScrollViewActivity.this);//定义一个Button

   button.setText("Button" + index);//设置Button的文本信息

   button.setId(index++);

   mLayout.addView(button, params);//添加一个Button控件

   mHandler.post(mScrollToButton);//传递一个消息进行滚动

  }

 

 };

 private Runnable mScrollToButton = new Runnable() {

 

  @Override

  public void run() {

   int off = mLayout.getMeasuredHeight() - sView.getHeight();

   if (off > 0) {

    sView.scrollTo(0, off);//改变滚动条的位置

   }

  }

 

 };

 

显示的效果以下:

 

25.5 补充资料

文章精选

Android ApiDemos/ScrollView2 添加自动滚动和智能焦点切换

[Android学习指南]使用ScrollView实现滚动效果

Android中ScrollView与ListView共用问题的解决方案

 

26 ProgressBar进度条

26.1 ProgressBar类概述

progressBar进度条是一个显示进度的控件,Android提供了两大类进度条样式,长形进度条样式progress-BarStyleHorizontal和圆形进度条progressBarStyleLarge.ProgressBar类的层次关系以下:

java.lang.Object

  android.view.View

   android.widget.ProgressBar

 

26.2 ProgressBar经常使用的方法

方法

功能描述

返回值

ProgressBar

3个构造函数:

ProgressBar(Context contex)

ProgressBar(Context contex,AttributeSet attrs)

ProgressBar(Context contex,AttributeSet attrs,intdefStyle)

 

null

onAttachedToWindow()

视图附加到窗体时调用

void

onDraw(Canvas canvas)

绘制视图时,该方法被调用

void

onMeasure(int widthMeasureSpec,int heightMeasureSpec)

该方法被重写时,必须调用setMeasedDimension(int,int)来存储已测量视图的高度和宽度,不然将经过measure(int,int)抛出一个IllegalStateException异常

void

onDetachedFromWindow()

从窗体分离事件的响应方法。当视图Progress从窗体上分离或移除时调用

void

addFocusables(ArrayList<View>views,int direction)

继承自android.view.View的方法,用于为当前ViewGroup中的全部子视图添加焦点获取能力

void

addTouchables(ArrayList<View views>)

继承自android.view.View的方法,用于为子视图添加触摸能力

void

getBaseline

继承自android.view.View的方法。返回窗口空间的文本基准线到其顶边界的偏移量

int

dispatchDisplayHint(int hint)

继承自android.view.View的方法。分发视图是否显示的提示

void

dispatchDraw(Canvas canvas)

继承自android.view.View的方法。调用次方法来绘制子视图

void

 

 

26.3 ProgressBar的使用

要实现一个简单的进度条的效果,咱们能够首先在XML文件中声明一个长形进度条和一个圆形进度条:

<TextView 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/hello"

    />

  <ProgressBar

    android:id="@+id/ProgressBar01"

    style="?android:attr/progressBarStyleHorizontal" //设置样式为长形进度条

    android:layout_width="200dp"

    android:layout_height="wrap_content"

    android:visibility="gone"  //设置当前不可见

  />

  <ProgressBar

        android:id="@+id/ProgressBar02"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        style="?android:attr/progressBarStyleLarge" //设置样式为圆形进度条

        android:max="100"

        android:progress="50"

        android:secondaryProgress="70"

       android:visibility="gone"  //设置当前不可见

  />

  <Button

    android:id="@+id/Button01"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

android:text="开始" />

 

而后在Activity中实现监听并经过线程来改变ProgressBar的值:

/设置窗口模式,,由于须要显示进度条在标题栏

       requestWindowFeature(Window.FEATURE_PROGRESS);

       setProgressBarVisibility(true);

       setContentView(R.layout.main);

      

       //取得ProgressBar

       m_ProgressBar = (ProgressBar) findViewById(R.id.ProgressBar01);

       m_ProgressBar2= (ProgressBar) findViewById(R.id.ProgressBar02);

       mButton01 = (Button)findViewById(R.id.Button01);

      

       m_ProgressBar.setIndeterminate(false);

       m_ProgressBar2.setIndeterminate(false);

      

       //当按钮按下时开始执行,

        mButton01.setOnClickListener(new Button.OnClickListener()

        {

          @Override

          public void onClick(View v)

          {

            // TODO Auto-generated method stub

          

          //设置ProgressBar为可见状态

          m_ProgressBar.setVisibility(View.VISIBLE);

          m_ProgressBar2.setVisibility(View.VISIBLE);

          //设置ProgressBar的最大值

          m_ProgressBar.setMax(100);

          //设置ProgressBar当前值

          m_ProgressBar.setProgress(0);

          m_ProgressBar2.setProgress(0);

 

          //经过线程来改变ProgressBar的值

              new Thread(new Runnable() {

                  public void run()

                  {

                     for (int i = 0; i < 10; i++)

                     {

                         try

                         {

                            intCounter = (i + 1) * 20;

                            Thread.sleep(1000);

 

                            if (i == 4)

                            {

                                Message m = new Message();

 

                                m.what = ProgressBarActivity.GUI_STOP_NOTIFIER;

                                ProgressBarActivity.this.myMessageHandler.sendMessage(m);

                                break;

                            }

                            else

                            {

                                Message m = new Message();

                                m.what = ProgressBarActivity.GUI_THREADING_NOTIFIER;

                                ProgressBarActivity.this.myMessageHandler.sendMessage(m);

                            }

                         }

                         catch (Exception e)

                         {

                            e.printStackTrace();

                         }

                     }

                  }

              }).start();

           }

       });

    }

 

      Handler myMessageHandler = new Handler()

      {

        // @Override

         public void handleMessage(Message msg)

         {

             switch (msg.what)

             {

             //ProgressBar已是对大值

             case ProgressBarActivity.GUI_STOP_NOTIFIER:

                m_ProgressBar.setVisibility(View.GONE);

                m_ProgressBar2.setVisibility(View.GONE);

                Thread.currentThread().interrupt();

                break;

             case ProgressBarActivity.GUI_THREADING_NOTIFIER:

                if (!Thread.currentThread().isInterrupted())

                {

                    // 改变ProgressBar的当前值

                    m_ProgressBar.setProgress(intCounter);

                    m_ProgressBar2.setProgress(intCounter);

                   

                    // 设置标题栏中前景的一个进度条进度值

                    setProgress(intCounter*100);

                    // 设置标题栏中后面的一个进度条进度值

                    setSecondaryProgress(intCounter*100);//

                }

                break;

             }

             super.handleMessage(msg);

        }

      };

 

效果以下:

 

 

 

27 SeekBar拖动条

27.1 SeekBar类概述

SeekBar是ProgressBar的扩展,在其基础上增长了一个可滑动的滑片(注:就是那个可拖动的图标)。用户能够触摸滑片并向左或向右拖动,再或者可使用方向键均可以设置当前的进度等级。不建议把能够获取焦点的widget放在SeekBar的左边或右边。

SeekBar能够附加一个SeekBar.OnSeekBarChangeListener以得到用户操做的通知。

 

SeekBar类的层次关系以下:

public class SeekBar extends AbsSeekBar

 

java.lang.Object

         android.view.View

                android.widget.ProgressBar

                            android.widget.AbsSeekBar

                                     android.widget.SeekBar

 

27.2 SeekBar经常使用的方法

 

方法

功能描述

返回值

SeekBar

3个构造函数:

SeekBar(Context contex)

SeekBar(Context contex,AttributeSet attrs)

SeekBar(Context contex,AttributeSet attrs,intdefStyle)

null

setOnSeekBarChangeListener(SeekBar.OnSeekBarChangeListener)

用于注册拖动条的监听器,这个监听器用于监听改变拖动条状态的事件

void

drawableStateChanged()

继承自ProgressBar的方法。该方法在视图状态的变化影响到所显示的可绘制对象的状态时调用。

void

onAttacedToWindow()

继承自ProgressBar的方法。该方法在视图添加到窗体时调用

 

onDraw(Canvas canvas)

继承自ProgressBar的方法。该方法在绘制视图时调用

void

onMessure(int w,int h)

继承自ProgressBar的方法。该方法被重写时,必须调用setMeasedDimension(int,int)来存储已测量视图的高度和宽度,不然将经过measure(int,int)抛出一个IllegalStateException异常

void

 

27.3 SeekBar属性

XML属性

属性名称

描述

android:thumb

Seekbar上绘制的thumb(可拖动的那个图标)

 

27.4 SeekBar的使用

在xml中声明一个SeekBar,两个TextView,一个用于显示当前SeekBar的值,一个用于显示调节的状态(正在调节或者以及中止调节):

<SeekBar android:id="@+id/seek"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:max="100"

        android:progress="50"

        android:secondaryProgress="75" />

 

    <TextView android:id="@+id/progress"

         android:layout_width="fill_parent"

        android:layout_height="wrap_content" />

 

    <TextView android:id="@+id/tracking"

         android:layout_width="fill_parent"

        android:layout_height="wrap_content" />

 

而后在Activity中:

//取得SeekBar对象

       mSeekBar = (SeekBar) findViewById(R.id.seek);

       mSeekBar.setOnSeekBarChangeListener(this);

       mProgressText = (TextView) findViewById(R.id.progress);

       mTrackingText = (TextView) findViewById(R.id.tracking);

    }

 

    //在拖动中--即值在改变

    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch)

    {

       mProgressText.setText("当前值:"+progress);

    }

    public void onStartTrackingTouch(SeekBar seekBar)

    {

       mTrackingText.setText("正在调节");

    }

    //中止拖动

    public void onStopTrackingTouch(SeekBar seekBar)

    {

       mTrackingText.setText("中止调节");

    }

效果以下:

 

27.5 补充资料

补充

         文章连接

在android里作一个竖着的seekbar

http://blog.csdn.net/saintswordsman/archive/2010/01/23/5248233.aspx

Android UI设计 SeekBar拖动条用法

http://www.pocketdigi.com/20100813/36.html

 

28 RatingBar评分条

28.1 RatingBar类概述

RatingBar是基于SeekBar和ProgressBar的扩展,用星型来显示等级评定。使用RatingBar的默认大小时,用户能够触摸/拖动或使用键来设置评分,它有两种样式(小风格用ratingBarStyleSmall,大风格用ratingBarStyleIndicator),其中大的只适合指示,不适合于用户交互。

当使用能够支持用户交互的RatingBar时,不管将控件(widgets)放在它的左边仍是右边都是不合适的。

只有当布局的宽被设置为wrap  content时,设置的星星数量(经过函数setNumStars(int)或者在XML的布局文件中定义)将显示出来(若是设置为另外一种布局宽的话,后果没法预知)。

次级进度通常不该该被修改,由于他仅仅是被看成星型部份内部的填充背景。

 

RatingBar的层次关系以下所示:

public class RatingBar extends AbsSeekBar

 

java.lang.Object

         android.view.View

                android.widget.ProgressBar

                       android.widget.AbsSeekBar

                              android.widget.RatingBar

 

28.2 RatingBar的属性

 XML属性

属性名称

描述

android:isIndicator

RatingBar是不是一个指示器(用户没法进行更改)

android:numStars

显示的星型数量,必须是一个整形值,像“100”。

android:rating

默认的评分,必须是浮点类型,像“1.2”。

android:stepSize

评分的步长,必须是浮点类型,像“1.2”。

 

28.3 RatingBar的经常使用方法

公共方法       

        (1) public int getNumStars ()

返回显示的星型数量

返回值: 显示的星型数量

                           

 

(2)public RatingBar.OnRatingBarChangeListener getOnRatingBarChangeListener ()

返回值

监听器(可能为空)监听评分改变事件

 

(3)public float getRating ()

获取当前的评分(填充的星型的数量)

返回值

当前的评分

 

(4)public float getStepSize ()

获取评分条的步长

返回值

The step size.

步长

 

(5)public boolean isIndicator ()

返回值

                            判断当前的评分条是否仅仅是一个指示器(注:即可否被修改)

 

(6)public void setIsIndicator (boolean isIndicator)

设置当前的评分条是否仅仅是一个指示器(这样用户就不能进行修改操做了)

参数

isIndicator       Bool值,是不是一个指示器

 

(7)public synchronized void setMax (int max)

设置评分等级的范围,从0到max

参数

max         评分条最大范围。

 

(8)public void setNumStars (int numStars)

设置显示的星型的数量。为了可以正常显示它们,建议将当前widget的布局宽度设置为wrap content

参数

numStars         星型的数量

 

(9)public void setOnRatingBarChangeListener (RatingBar.OnRatingBarChangeListener listener)

设置当评分等级发生改变时回调的监听器

参数

listener   监听器

 

(10)public void setRating (float rating)

设置分数(星型的数量)

参数

rating      设置的分数

 

(11)public void setStepSize (float stepSize)

设置当前评分条的步长(step size)

参数

stepSize 评分条的步进。例如:若是想要半个星星,它的值为0.5。

 

受保护方法

(12)protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

权衡 view 和 content 来决定它的宽度和高度的整齐。它被measure(int, int) 调用 而且应该被子类所覆盖,以便提供准确高效的布局测量。

规定: 当覆盖这个方法的时候,你必须调用 setMeasuredDimension(int, int)以便存储精确的视图的宽和高。若是不这样作的话将触发llegalStateException异常,被函数 measure(int, int)抛出。调用父类 onMeasure(int, int)是合理的。

尺寸的基本类的实现默认是背景大小,除非经过MeasureSpec容许大的尺寸。子类应该覆盖 onMeasure(int, int) 以便提供更好的布局大小。

若是这个方法被覆盖,子类应该负责确保标准的宽和高至少是视图的最小宽度和高度的值(分别为getSuggestedMinimumHeight()getSuggestedMinimumWidth()两方法)。

参数

       widthMeasureSpec     受主窗口支配的水平空间要求。这个需求经过 View.MeasureSpec.进行编码。

       heightMeasureSpec   受主窗口支配的垂直空间要求。这个需求经过 View.MeasureSpec.进行编码。

 

 

28.4 RatingBar的使用

咱们在xml中声明三种 样式的RatingBar:

<RatingBar android:layout_width="wrap_content"

 

       android:layout_height="wrap_content" style="?android:attr/ratingBarStyleIndicator"

 

       android:id="@+id/ratingbar_Indicator" />

 

    <RatingBar android:layout_width="wrap_content"

 

       android:layout_height="wrap_content" style="?android:attr/ratingBarStyleSmall"

 

       android:id="@+id/ratingbar_Small" android:numStars="20" />

 

    <RatingBar android:layout_width="wrap_content"

 

       android:layout_height="wrap_content" style="?android:attr/ratingBarStyle"

 

       android:id="@+id/ratingbar_default" />

 

在Activity中声明并显示:

final RatingBar ratingBar_Small = (RatingBar)findViewById(R.id.ratingbar_Small);

 

        final RatingBar ratingBar_Indicator = (RatingBar)findViewById(R.id.ratingbar_Indicator);

 

        final RatingBar ratingBar_default = (RatingBar)findViewById(R.id.ratingbar_default);

 

 

 

        ratingBar_default.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener(){

 

 

 

    public void onRatingChanged(RatingBar ratingBar, float rating,

 

      boolean fromUser) {

 

     ratingBar_Small.setRating(rating);

 

     ratingBar_Indicator.setRating(rating);

 

     Toast.makeText(RatingBarActivity.this, "rating:"+String.valueOf(rating),

 

       Toast.LENGTH_LONG).show();

 

    }});

 

28.5 补充资料

补充

         文章连接

                   Android 控件之RatingBar评分条

                   Android更换RatingBar图片

                   [Android学习指南]RatingBar 评分条

 

 

29 ProgressDialog对话框中的进度条

29.1 ProgressDialog类概述

前面,咱们学习了对话框和进度条,如今将进度条加入到对话框,使得对话框更加的完善。咱们知道进度条有长形进度条和圆形进度条,因此也就有对话框中的长形进度条和对话框中的圆形进度条。

 

 

29.2 ProgressDialog中经常使用的方法

setProgressStyle : 设置进度条风格,风格为圆形,旋转的或者风格为长形的;

setTitle : 设置ProgressDialog的标题

setMessage : 设置ProgressDialog的提示信息

setIcon :设置ProgressDialog的标题图标

setIndeterminate :设置ProgressDialog的进度条是否不明确

setCancelable :设置ProgressDialog是否能够按回退键取消

setButton :设置ProgressDialog的一个Button(须要监听Button事件)

show :显示ProgressDialog

 

29.3 ProgressDialog的使用

要实现29.1节中图形中所示的效果,咱们首先在xml中声明两个Button:

<Button

    android:id="@+id/yuan_button01"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="圆形进度条" />

  <Button

    android:id="@+id/chang_button02"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

android:text="长形进度条" />

 

在Activity中获得Button对象,并分别实现监听,在监听里面生成咱们所须要的带进度条的对话框,对于长形进度条咱们须要用线程来实时更新进度条的值。具体代码以下:

/获得按钮对象

       mButton01 = (Button)findViewById(R.id.yuan_button01);

       mButton02 = (Button)findViewById(R.id.chang_button02);

      

       //设置mButton01的事件监听

        mButton01.setOnClickListener(new Button.OnClickListener() {

           @Override

           public void onClick(View v)

           {

              // TODO Auto-generated method stub

             

              //建立ProgressDialog对象

              m_pDialog = new ProgressDialog(ProgressDialogActivity.this);

 

              // 设置进度条风格,风格为圆形,旋转的

              m_pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

 

              // 设置ProgressDialog 标题

              m_pDialog.setTitle("提示");

             

              // 设置ProgressDialog 提示信息

              m_pDialog.setMessage("这是一个圆形进度条对话框");

 

              // 设置ProgressDialog 标题图标

              m_pDialog.setIcon(R.drawable.imag1);

 

              // 设置ProgressDialog 的进度条是否不明确

              m_pDialog.setIndeterminate(false);

             

              // 设置ProgressDialog 是否能够按退回按键取消

              m_pDialog.setCancelable(true);

             

              // 设置ProgressDialog 的一个Button

              m_pDialog.setButton("肯定", new DialogInterface.OnClickListener() {

                  public void onClick(DialogInterface dialog, int i)

                  {

                     //点击“肯定按钮”取消对话框

                     dialog.cancel();

                  }

              });

 

              // 让ProgressDialog显示

              m_pDialog.show();

           }

       });

       

      //设置mButton02的事件监听

        mButton02.setOnClickListener(new Button.OnClickListener() {

           @Override

           public void onClick(View v)

           {

              // TODO Auto-generated method stub

             

              m_count = 0;

             

              // 建立ProgressDialog对象

              m_pDialog = new ProgressDialog(ProgressDialogActivity.this);

             

              // 设置进度条风格,风格为长形

              m_pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

             

              // 设置ProgressDialog 标题

              m_pDialog.setTitle("提示");

             

              // 设置ProgressDialog 提示信息

              m_pDialog.setMessage("这是一个长形对话框进度条");

             

              // 设置ProgressDialog 标题图标

              m_pDialog.setIcon(R.drawable.imag2);

             

              // 设置ProgressDialog 进度条进度

              m_pDialog.setProgress(100);

             

              // 设置ProgressDialog 的进度条是否不明确

              m_pDialog.setIndeterminate(false);

             

              // 设置ProgressDialog 是否能够按退回按键取消

              m_pDialog.setCancelable(true);

             

              // 让ProgressDialog显示

              m_pDialog.show();

             

              new Thread()

              {

                  public void run()

                  {

                     try

                     {

                         while (m_count <= 100)

                         {

                            // 由线程来控制进度。

                            m_pDialog.setProgress(m_count++);

                            Thread.sleep(100);

                         }

                         m_pDialog.cancel();

                     }

                     catch (InterruptedException e)

                     {

                         m_pDialog.cancel();

                     }

                  }

              }.start();

             

           }

       });

   

30 Notification、NotificationManager状态栏提示

30.1 概述

当有未接电话或者短信的时候,在Android手机的顶部状态栏会出现一个小图标,提示用户有没有处理的快讯,这时用触笔按住状态栏往下拖动时就能够展开并查看这些快讯,Android提供了NotificationManager来管理这些状态栏信息,提供了Notification来处理这些快讯信息。

 

30.2 Notification属性

Notification经常使用的属性:

 

audioStreamType :当声音响起时,所用的音频流的类型

 

contentIntent :当通知条目被点击时,就执行被设置的Intent

 

contentView :当通知被显示在状态条上的时候,同时这个被设置的视图被显示

 

default 指定哪一个值是要被设置为默认的

 

deleteIntent :当用户点击“Clear All Notifications”按钮区域删除全部通知的时候,这个被设置的Intent被执行

 

icon 状态条所用的图片

 

iconLevel :假如状态条的图片有几个级别,就设置这里

 

ledARGB : LED灯的颜色

 

ledOffMS LED : 关闭时的闪光时间,以毫秒计算

ledOnMS LED :开始时的闪光时间,以毫秒计算

number :这个通知表明事件的号码

sound :通知的声音

tickerText :通知被显示在状态栏时,所显示的信息

vibrate :振动模式

when :通知的时间戳

 

Notification经常使用的字段:

DEFAULT_ALL                  使用全部默认值,好比声音,震动,闪屏等等

        DEFAULT_LIGHTS            使用默认闪光提示

        DEFAULT_SOUNDS         使用默认提示声音

        DEFAULT_VIBRATE         使用默认手机震动 

      【说明】:加入手机震动,必定要在manifest.xml中加入权限:

                         <uses-permission android:name="android.permission.VIBRATE" />

        以上的效果常量能够叠加,即经过

                mNotifaction.defaults =DEFAULT_SOUND  |  DEFAULT_VIBRATE ;  

            或mNotifaction.defaults |=DEFAULT_SOUND   (最好在真机上测试,震动效果模拟器上没有)

 

        //设置flag位

           FLAG_AUTO_CANCEL          该通知能被状态栏的清除按钮给清除掉

        FLAG_NO_CLEAR                  该通知能被状态栏的清除按钮给清除掉

        FLAG_ONGOING_EVENT      通知放置在正在运行

        FLAG_INSISTENT                    是否一直进行,好比音乐一直播放,知道用户响应

 

 

30.3 Notification的方法

Notification.build构造Notification方法介绍:   

 void setLatestEventInfo(Context context , CharSequencecontentTitle,CharSequence  contentText,PendingIntent contentIntent)  

          

 功能: 显示在拉伸状态栏中的Notification属性,点击后将发送PendingIntent对象

参数: context             上下文环境

contentTitle      状态栏中的大标题

contentText      状态栏中的小标题

contentIntent    点击后将发送PendingIntent对象

说明:要是在Notification中加入图标,在状态栏和状态条中显示图标必定要用这个方法,不然报错!

 

NotificationManager类的经常使用方法:

过获取系统服务来获取该对象:           

NotificationManager mNotificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE) ;

public  void cancelAll()                                  移除全部通知 (只是针对当前Context下的Notification)

public  void cancel(int id)                                      移除标记为id的通知 (只是针对当前Context下的全部Notification)

public  void notify(String tag ,int id, Notification notification) 将通知加入状态栏, 标签为tag,标记为id

public  void notify(int id, Notification notification)           将通知加入状态栏,,标记为id

 

30.4 Notification的使用

首先咱们定义了2个XMl文件,一个xml中声明了一个TextView和一个Button。一个xml中咱们只有一个TextView.,这个TextView是用来查看快讯的。

main.xml:

<TextView

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:layout_weight="0"

       android:paddingBottom="4dip"

       />

<Button

       android:id="@+id/Button01"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

        android:text="Button01"

       >

       <requestFocus/>

    </Button>

 

main2.xml:

<TextView 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="谢谢使用!"

/>

 

在Activity NotificantionActivity01里面:

Button            m_Button1;

 

    //声明通知(消息)管理器

    NotificationManager  m_NotificationManager;

    Intent            m_Intent;

    PendingIntent     m_PendingIntent;

    //声明Notification对象

    Notification      m_Notification;

 

 

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState)

    {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

       //初始化NotificationManager对象

       m_NotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

 

       //获取4个按钮对象

       m_Button1 = (Button) findViewById(R.id.Button01);

      

 

       //点击通知时转移内容

       m_Intent = new Intent(NotificantionActivity01.this, NotificantionActivity02.class);

       //主要是设置点击通知时显示内容的类

       m_PendingIntent = PendingIntent.getActivity(NotificantionActivity01.this, 0, m_Intent, 0);

       //构造Notification对象

       m_Notification = new Notification();

 

       m_Button1.setOnClickListener(new Button.OnClickListener() {

           public void onClick(View v)

           {

              //设置通知在状态栏显示的图标

              m_Notification.icon = R.drawable.img1;

              //当咱们点击通知时显示的内容

              m_Notification.tickerText = "Button1通知内容...........";

              //通知时发出默认的声音

              m_Notification.defaults = Notification.DEFAULT_SOUND;

              //设置通知显示的参数

              m_Notification.setLatestEventInfo(NotificantionActivity01.this, "Button1", "Button1通知", m_PendingIntent);

              //能够理解为执行这个通知

              m_NotificationManager.notify(0, m_Notification);

           }

       });

 

而后在NotificantionActivity02里:

//这里直接限制一个TextView

      setContentView(R.layout.main2);

 

显示的效果为:

相关文章
相关标签/搜索