作者:韩亚飞_yue31313_韩梦飞沙
1.Android个人每天总结.doc
2.Android基础总结.doc
这两个文件 篇幅太长, 有100多页。 直接放在这里很不合适。
这里最多 一个篇幅, 最好是不超过。10页。
====
Android基础
day01
Ø Eclipse中一个安卓项目的组成部分
一、总框架
应用名:也就是应用装好后的名称(与应用管理的名称可能不同)
源代码目录
包名,这个包名与一开始建项目时的唯一标识包名要区分.
Activity(活动类,类似main方法),一个应用只有一个起作用.
切换Activity类在AndroidMainfext.xml中android:name属性
自动生成,用于自动编译检查代码是否正确
资源文件与代码之间的桥梁,生成资源文件的映射,让外部调用
版本类库
jar包,在项目下建一个libs目录后,里的jar包会自动加载到此.
资源路径,不会在R文件注册
二进制文件,包括class、资源文件、dex、apk等
资源目录-一旦定义好就会在R.java类中自动生成映射
DPI是“dot per inch”的缩写,每英寸像素数。
放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
放低分辨率的图片,如QVGA (240x320)
放中等分辨率的图片,如HVGA (320x480)
放超高分遍率的图片,如dpi一般是320,
里面是main.xml 里面定义view元素及布局.
里面是main.xml引用的String.xml,便于国际化
清单文件,在软件安装的时候被读取,定义软件的关键配置
用来混淆代码的配置文件,防止别人反编译
供Eclipse使用,读取该项目使用Android版本号。
二、Activity类
三、R类
四、res资源包
所有资源文件都在这个包下就会自动在R.java文件里注册
所以,只在有资源文件都放在这个包下,并建立对应的文件夹,好区分
自带以下三个文件夹
(一)drawable:图片资源包
里面有四种屏幕类型.每种类型对应不同的分辨率
图片不能大写
(二)layout资源包
(三)values资源包 @String
五、AndroidManifest.xml
<?xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="sent.msn"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".SentMSNActivity2"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
六、proguard-project.txt
七、profect.properties
八、运行流程
Ø Android常用数据收集
一、Android常用权限
sd卡写入权限:WRITE_EXTERNAL_STORAGE
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
二、安卓中文件的几种保存模式
安卓内核是Linux,所以只要有文件,就有权限区分.
看情况:如果在Activity中,Context可以省略.
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
三、Android的计量单位px,in,mm,pt,dp,dip,sp
px :是屏幕的像素点
in :英寸
mm :毫米
pt :磅,1/72 英寸
dp :一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1pxdip:等同于dpsp :同dp相似,但还会根据用户的字体大小偏好来缩放。建议使用sp作为文本的单位,其它用dip
dip和px 的关系:QVGA: density=0.75; densityDpi=120; QVGA(240*320)
HVGA: density=1.0; densityDpi=160; HVGA(320*480)
VGA: density=1.0; densityDpi=160; VGA(480*640)
WVGA: density=1.5; densityDpi=240; WVGA(480*800)
WQVGA:density=2.0; densityDpi=120; WQVGA(240*400)
densityDip值表示每英寸有多少个显示点,与分辨率是两个概念
不同densityDpi下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)为例densityDpi=120时
屏幕实际分辨率为240px*400px (两个点对应一个分辨率)
状态栏和标题栏高各19px或者25dip
横屏是屏幕宽度400px 或者800dip,工作区域高度211px或者480dip
竖屏时屏幕宽度240px或者480dip,工作区域高度381px或者775dipdensityDpi=160时
屏幕实际分辨率为320px*533px(3个点对应两个分辨率)
状态栏和标题栏高个25px或者25dip
横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者480dip
竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dipdensityDpi=240时
屏幕实际分辨率为480px*800px(一个点对于一个分辨率)状态栏和标题栏高个38px或者25dip横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者480dip竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dipapk的资源包中
当屏幕densityDpi=240时,使用hdpi 标签的资源
当屏幕densityDpi=160时,使用mdpi标签的资源
当屏幕densityDpi=120时,使用ldpi标签的资源
不加任何标签的资源是各种分辨率情况下共用的
布局时尽量使用单位dip,少使用px
dp与px换算公式:
pixs =dips *(densityDpi/160).
dips=(pixs*160)/densityDpi
dp与px转换的方法:
public static intdip2px(Context context,float dipValue){ final floatscale =context.getResources().getDisplayMetrics().density; return (int)(dipValue * scale+0.5f);}public static intpx2dip(Context context, float pxValue){ final float scale=context.getResource().getDisplayMetrics().density; return (int)(pxValue / scale+0.5f);}
VGA : 640*480
QVGA : 320*240
HVGA : 320*480
WVGA : 800*480
WQVGA : 480X272或400X240
Ø View
一、View的定义及作用
View是Android下的一个超类,在Android中,这个类几乎包含了所有的屏幕类型。但它们之间有一些不同。每一个view都有一个用于绘画的画布。这个画布可以用来进行任意扩展。
Android应用就是:UI+事件开发Android应用就是布局UI,给UI中的各种各样的控件根据需求添加事件.
View是UI最基本的组成部分,负责绘制UI元素和界面动作的监听。
.整个手机屏幕,也是一个View,就像一块大画布,上面可以放各种各样的界面元素,如Button,EditText(文本域)或其它view.
也就是说,View可以认为是其他View,或Button,文本域等界面元素的容器。
所属包:
java.lang.Object
|-----android.view.View
继承结构:
View extends Object implements Drawable.CallbackKeyEvent.Callback AccessibilityEventSource
二、View怎么用?
ViewGroup类是View类的子类,但是它可以充当其他控件的容器。ViewGroup的子控件既可以是普通的View,也可以是ViewGroup。一些高级控件如Gallery、GridView等都是继承自ViewGroup。Android中为每种不同的布局提供一个ViewGroup的子类,如LinearLayout、TableLayout、RelativeLayout、FrameLayout、AbsoluteLayout等。
(一)View类在布局中常用的属性及对应的方法
属性名称 | 对应方法 | 描述 |
android:background | setBackgroundResource(int) | 设置背景 |
android:clickable | setClickable(boolean) | 设置View是否响应单击事件 |
android:visibility | setVisibility(int) | 控制View的可见性 |
android:focusable | setFocusable(boolean) | 控制View是否可以获取焦点 |
android:id | setId(int) | 为View设置标识符,可通过findViewById方法获取 |
android:longClickable | setLongClickable(boolean) | 设置View是否响应长单击事件 |
android:soundEffectsEnabled | setSoundEffectsEnabled(boolean) | 设置当View触发单击等事件时是否播放音效 |
android:saveEnabled | setSaveEnabled(boolean) | 如果未作设置,当View被冻结时将不会保存其状态 |
android:nextFocusDown | setNextFocusDownId(int) | 定义当向下搜索时应该获取焦点的View,如果该View不存在或不可见,则会抛出RuntimeException异常 |
android:nextFocusLeft | setNextFocusLeftId(int) | 定义当向左搜索时应该获取焦点的View |
android:nextFocusRight | setNextFocusRightId(int) | 定义当向右搜索时应该获取焦点的View |
android:nextFocusUp | setNextFocusUpId(int) | 定义当向上搜索时应该获取焦点的View |
1. 通用属性:基本元素都有的
① id: 元素的唯一标志
android:id="@+id/label" id属性
② text:文本内容
android:text="@string/call_num"/>----内容
③ ems ="10" 设置TextView或者Edittext的宽度为10个字符的宽度
④ background:指定该控件所使用的背景色,RGB命名法
⑤ layout_width:指定Container组件的宽度
有三个可以用:
android:layout_width="match_parent"参照父View,也就是屏幕
android:layout_width="fill_parent"填充父view,也就是与屏幕一样
上面两个功能一样
android:layout_width="wrap_content"包围里面的内容.
⑥ layout_height:指定Container组件的高度
2. gravity:对控件内容操作方向的位置-
3. layout_gravity:对控件本身相对于parentView位置
二者共同参数:可取的属性及说明
属性值 | 说明 |
top | 不改变控件大小,对齐到容器顶部 |
bottom | 不改变控件大小,对齐到容器底部 |
left | 不改变控件大小,对齐到容器左侧 |
right | 不改变控件大小,对齐到容器右侧 |
center_vertical | 不改变控件大小,对齐到容器纵向中央位置 |
center_horizontal | 不改变控件大小,对齐到容器横向中央位置 |
center | 不改变控件大小,对齐到容器中央位置 |
fill_vertical | 若有可能,纵向拉伸以填满容器 |
fill_horizontal | 若有可能,横向拉伸以填满容器 |
fill | 若有可能,纵向横向同时拉伸填满容器 |
|
|
4. 权重属性:layout_weight
注意:用这个的时候,把对应的控件的layout_width或height设成0dp.
当前view占屏幕空间的权重.
意思是需要显示多大的视图就占据多大的屏幕空间
表示每个view在一行或一列中占有的权重,默认是0,也就是有多大就占多少空间
如果两个文本编辑元素每一个的layout_weight值都设置为1,则两者平分在父视图布局剩余的宽度(因为我们声明这两者的重要度相等)。如果两个文本编辑元素其中第一个的layout_weight值设置为1,而第二个的设置为2,则二者按1:2获得空间.
5. 属性值为true或false 的属性
① layout_centerHrizontal 水平居中
② layout_centerVertical 垂直居中
③ layout_centerInparent 相对于父元素完全居中
④ layout_alignParentBottom贴紧父元素的下边缘
⑤ layout_alignParentLeft 贴紧父元素的左边缘
⑥ layout_alignParentRight 贴紧父元素的右边缘
⑦ layout_alignParentTop 贴紧父元素的上边缘
⑧ layout_alignWithParentIfMissing 如果对应的兄弟元素找不到就以父元素做参照物
⑨ sigleLine:如果设置为真的话,则控件的内容在同一行中进行显示
6. 属性值必须为id的引用名“@id/id-name”
① layout_below 在某元素的下方
② layout_above 在某元素的的上方
③ layout_toLeftOf 在某元素的左边
④ layout_toRightOf 在某元素的右边
⑤ layout_alignTop 本元素的上边缘和某元素的的上边缘对齐
⑥ layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐
⑦ layout_alignBottom本元素的下边缘和某元素的的下边缘对齐
⑧ layout_alignRight 本元素的右边缘和某元素的的右边缘对齐
7. 属性值为具体的像素值
如30dip(dp),40px(最好不用) 10sp(文字用)
① width:指定控件的宽度
② height:指定控件的高度
③ layout_marginBottom:离某元素底边缘的距离
④ layout_marginLeft:离某元素左边缘的距离
⑤ layout_marginRight:离某元素右边缘的距离
⑥ layout_marginTop:离某元素上边缘的距离
⑦ ndroid:textSize:指定控件当中字体的大小
⑧ padding:指定控件的内边距,也就是说控件当中的内容
⑨ paddingLeft:本元素内容离本元素右边缘的距离
⑩ paddingRight:本元素内容离本元素右边缘的距离
11 paddingBottom:本元素内容离本元素下边缘的距离
12 paddingTop:本元素内容离本元素上边缘的距离
13 verticalSpacing:每个元素之间垂直间距
android:verticalSpacing="10dp"
14 horizontalSpacing每个元素之间水平间距
android:horizontalSpacing="10dp"
8. scaleType:控制图片如何resized/moved来匹对ImageView的size
android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别:
① CENTER/center :
按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
② CENTER_CROP/ centerCrop
: 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
③ CENTER_INSIDE/ centerInside
将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
④ FIT_CENTER/ fitCenter
把图片按比例扩大/缩小到View的宽度,居中显示
⑤ FIT_END /fitEnd
把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
⑥ FIT_START/ fitStart
把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
⑦ FIT_XY /fitXY
把图片不按比例扩大/缩小到View的大小显示
⑧ MATRIX /matrix
用矩阵来绘制,动态缩小放大图片来显示。
** 要注意一点,Drawable文件夹里面的图片命名是不能大写的。
9. android:interpolator:控制动画的进度
interpolator定义一个动画的变化率(the rate of change)。这使得基本的动画效果(alpha, scale, translate, rotate)得以加速,减速,重复等。用通俗的一点的话理解就是:动画的进度使用 Interpolator 控制。interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等。
Interpolator 是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,即 getInterpolation (float input),该方法 maps a point on the timeline to a multiplier to be applied to thetransformations of an animation。Android 提供了几个 Interpolator 子类,实现了不同的速度曲线,如下:
AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时侯加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始减速
LinearInterpolator 在动画的以均匀的速率改变
对于LinearInterpolator ,变化率是个常数,即 f (x) = x.
public float getInterpolation(float input){
return input;
}
Interpolator其他的几个子类,也都是按照特定的算法,实现了对变化率。还可以定义自己的 Interpolator 子类,实现抛物线、自由落体等物理效果。
10. EditText的android:hint
设置EditText为空时输入框内的提示信息。
11. orientation 线性布局的方向
android:orientation="vertical" >--方向:竖向
horizontal表示横向
12. inputType:定义输入的默认方式:
android:inputType="phone"--表示用于打电话:自动弹出数字键盘
13. <requestFocus/> 放在哪个标签里,就是哪个在一启动时或取焦点
(二)view的布局
1. RelativeLayout(相对布局)
android-sdk-windows/docs/guide/topics/ui/layout-objects.html#relativelayout
相对布局常用属性
RelativeLayout布局中,子控件的位置是相对于兄弟控件或父容器而决定的。出于性能考虑,在设计相对布局时要按照控件之间的依赖关系排列,如View A 的位置相对于View B 类决定,则需要保证在布局文件中View B 在View A 的前面。
相对布局中只取true或false的属性
属性名称 | 属性说明 |
android:layout_centerHorizontal | 当前控件位于父控件的横向中间位置 |
android:layout_centerVertical | 当前控件位于父控件的纵向中间位置 |
android:layout_centerInParent | 当前控件位于父控件的中央位置 |
android:layout_alignParentBottom | 当前控件低端与父控件低端对齐 |
android:layout_alignParentLeft | 当前控件左侧与父控件左侧对齐 |
android:layout_alignParentRight | 当前控件右侧与父控件右侧对齐 |
android:layout_alignParentTop | 当前控件顶端与父控件顶端对齐 |
android:layout_alignWithParentIfMissing | 当参照控件不存在或不可见时参照父控件 |
相对布局中取值为其他控件id的属性及说明 :后面接要参照的id.格式如:
属性名称 | 属性说明 |
android:layout_toRightOf | 使当前控件位于给出id控件的右侧 |
android:layout_toLeftOf | 使当前控件位于给出id控件的左侧 |
android:layout_above | 使当前控件位于给出id控件的上方 |
android:layout_below | 使当前控件位于给出id控件的下方 |
android:layout_alignTop | 使当前控件的上边界与给出id控件的上边界对齐 |
android:layout_alignBottom | 使当前控件的下边界与给出id控件的下边界对齐 |
android:layout_alignLeft | 使当前控件的左边界与给出id控件的左边界对齐 |
android:layout_alignRight | 使当前控件的右边界与给出id控件的右边界对齐 |
相对布局中取值为像素的属性及说明
属性名称 | 属性说明 |
android:layout_marginLeft | 当前控件的左侧的留白 |
android:layout_marginRight | 当前控件的右侧的留白 |
android:layout_marginTop | 当前控件的上方的留白 |
android:layout_marginBottom | 当前控件的下方的留白 |
2. TableLayout(表格布局)
android-sdk-windows/docs/guide/topics/ui/layout-objects.html#tablelayout
① 表格布局:
是一个ViewGroup以表格显示它的子视图(view)元素,即行和列标识一个视图的位置。其实Android的表格布局跟HTML中的表格布局非常类似,TableRow就像HTML表格的<tr>标记。
② 用表格布局需要知道以下几点:
· android:shrinkColumns,表示有多少列.对应的方法:setShrinkAllColumns(boolean),作用:设置表格的列是否收缩(列编号从0开始,下同),多列用逗号隔开(下同),如android:shrinkColumns="0,1,2",即表格的第1、2、3列的内容是收缩的以适合屏幕,不会挤出屏幕。
· android:collapseColumns,对应的方法:setColumnCollapsed(int,boolean),作用:设置表格的列是否隐藏
· android:stretchColumns,对应的方法:setStretchAllColumns(boolean),作用:设置表格的列是否拉伸
· <?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
全局列属性: android:shrinkColumns="0,1,2">---有三列,从0开始
<TableRow><!-- row1 -->--表示第一行,里面是第一行包含的元素 <Button android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a Button1"
局部列属性:android:layout_column="0" --表示在第一列
/>
<Button android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a Button2"
android:layout_column="1" ---表示在第二列
注意:如果本行或上面的行中的列没有layout_column="0" 属性.那么这里的1,不会起作用. />
</TableRow>
③ TableLayout常用的属性:
全局列属性: android:shrinkColumns="0,1,2">---有三列,从0开始
android:layout_column="1" ---表示在第二列
注意:如果本行或上面的行中的列没有layout_column="0" 属性.那么这里的1,不会起作用.
TableLayout类常用属性及对应的方法
属性名称 | 对应方法 | 描述 |
android:collapseColumns | setColumnCollapsed(int,boolean) | 设置指定列号的列为Collapsed,列号从0开始计算 |
android:shrinkColumns | setShrinkAllColumns(boolean) | 设置指定列号的列为Shrinkable,列号从0开始计算 |
android:stretchColumns | setStretchAllColumns(boolean) | 设置指定列号的列为Stretchable,列号从0开始计算 |
3. FrameLayout(帧布局)
android-sdk-windows/docs/guide/topics/ui/layout-objects.html#framelayout
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
4. 线性布局(Linear Layout)
是一个ViewGroup以线性方向显示它的子视图(view)元素,即垂直地或水平地。
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >---表示线性坚直排列
android:orientation="horizontal">---表示线性水平排列
① LinearLayout常用的属性
LinearLayout常用的属性及对应设置方法
属性名称 | 对应方法 | 描述 |
android:orientation | setOrientation(int) | 设置线性布局的朝向,可取horizontal和vertical两种排列方式 |
android:gravity | setGravity(int) | 设置线性布局的内部元素的布局方式 |
5. 绝对布局(AbsoluteLayout)。
绝对布局:是一个ViewGroup以绝对方式显示它的子视图(view)元素,即以坐标的方式来定位在屏幕上位置。
这种布局方式很好理解,在布局文件或编程代码中设置View的坐标,从而绝对地定位。如下所示布局文件:
<AbsoluteLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/AbsoluteLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextViewandroid:id="@+id/txtIntro"
android:text="绝对布局"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_x="20dip"<!-- have an eye on ! -->
android:layout_y="20dip"><!--have an eye on ! -->
</TextView>
</AbsoluteLayout>
6. 标签布局(Tab Layout)
7. 网格视图(Grid View)
8. 列表视图(List View)
列表布局:是一个ViewGroup以列表显示它的子视图(view)元素,列表是可滚动的列表。列表元素通过ListAdapter自动插入到列表。
ListAdapter:扩展自Adapter,它是ListView和数据列表之间的桥梁。ListView可以显示任何包装在ListAdapter中的数据。该类提供两个公有类型的抽象方法:
1 publicabstractbooleanareAllItemsEnabled () :表示ListAdapter中的所有元素是否可激活的?如果返回真,即所有的元素是可选择的即可点击的。
2 publicabstractbooleanisEnabled (int position) :判断指定位置的元素是否可激活的?
下面通过一个例子来,创建一个可滚动的列表,并从一个字符串数组读取列表元素。当一个元素被选择时,显示该元素在列表中的位置的消息。
1)、首先,将res/layour/main.xml的内容置为如下:
<?xmlversion="1.0" encoding="utf-8"?>
<TextViewxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp">
</TextView>
这样就定义了元素在列表中的布局。
2)、src/skynet.com.cnblogs.www/HelloWorld.java文件的代码如下:
package skynet.com.cnblogs.www;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
publicclass HelloWorld extends ListActivity {
//注意这里Helloworld类不是扩展自Acitvity,而是扩展自ListAcitivty
/**Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(newArrayAdapter<String>(this, R.layout.main, COUNTRIES));
ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
publicvoidonItemClick(AdapterView<?> parent, View view,
int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(),((TextView) view).getText(),
Toast.LENGTH_SHORT).show();
}
});
}
staticfinal String[] COUNTRIES = new String[] {
"1", "2", "3", "4", "5",
"6", "7", "8", "9", "10",
"11", "12", "13", "14", "15",
"16", "17", "18", "19", "20",
"21", "22", "23", "24"
};
}
Note:onCreate()函数中并不像往常一样通过setContentView()为活动(Activity)加载布局文件,替代的是通过setListAdapter(ListAdapter)自动添加一个ListView填充整个屏幕的ListActivity。在此文件中这个方法以一个ArrayAdapter为参数:setListAdapter(new ArrayAdapter<String>(this, R.layout.main, COUNTRIES)),这个ArrayAdapter管理填入ListView中的列表元素。ArrayAdapter的构造函数的参数为:this(表示应用程序的上下文context)、表示ListViewde布局文件(这里是R.layout.main)、插入ListView的List对象对数组(这里是COUNTRES)。
setOnItemClickListener(OnItemClickListener)定义了每个元素的点击(on-click)的监听器,当ListView中的元素被点击时,onItemClick()方法被调用,在这里是即一个Toast消息——每个元素的位置将显示。
3)、运行应用程序得如下结果(点击1之后,在下面显示了1):
图7、列表布局
NOTE:如果你改了HelloWorld extends ListActivity 而不是Activity之后,运行程序是提示:“Conversion to Dalvik format failed with error 1”。可以这么解决:解决办法是 Project > Clean...> Clean project selected below > Ok
5.1、一个小的改进
上面我们是把要填充到ListView中的元素硬编码到HelloWorld.java文件中,这样就缺乏灵活性!也不符合推荐的应用程序的界面与控制它行为的代码更好地分离的准则!
其实我们可以把要填充到ListView的元素写到res/values/strings.xml文件中的<string-array>元素中,然后再源码中动态地读取。这样strings.xml的内容类似下面:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-arrayname="countries_array">
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
<item>7</item>
</string-array>
</resources>
然而HelloWorld.java文件中的onCreate()函数,则这样动态访问这个数组及填充到ListVies:
String[] countries = getResources().getStringArray(R.array.countries_array);
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item,countries));
5.2、补充说明
首先总结一下列表布局的关键部分:
· 布局文件中定义ListView
· Adapter用来将数据填充到ListView
· 要填充到ListView的数据,这些数据可以字符串、图片、控件等等
其中Adapter是ListView和数据源之间的桥梁,根据数据源的不同Adapter可以分为三类:
· String[]: ArrayAdapter
· List<Map<String,?>>:SimpleAdapter
· 数据库Cursor: SimpleCursorAdapter
使用ArrayAdapter(数组适配器)顾名思义,需要把数据放入一个数组以便显示,上面的例子就是这样的;SimpleAdapter能定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等;SimpleCursorAdapter是和数据库有关的东西。篇幅有限后面两种就不举例实践了。你可以参考android ListView详解orArrayAdapter,SimpleAdapter ,SimpleCursorAdapter 区别。
(三)view的事件监听(4种方法)
一个监听器有两部分组成:一个是监听的事件源,传过来谁就是谁,一个是具体的监听事件,也就是说,事件促发时,要执行的动作.
事件的监听机制在安卓中的应用:一个监听器可以监听多个事件源(view对象),只要给其添加同一个事件监听器就可以,
1. 通过匿名内部类实现
public class SentMSNActivity extends
private EditText et;
/** Called when the activity is first created. */
@Override
public void
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获得EditText对象以便获得其内容
et=(EditText) findViewById(R.id.callET);
//获得button对象
Button bt=(Button)findViewById(R.id.callBT);
//给Button对象添加监听
new
//定义监听到事件促发要运行的方法-拨打电话
public void
//在方法中获得电话号码
et.getText().toString();
//调用android的对象的api,拨打电话.
intent=new Intent();//创建一个意图对象
intent.setAction(Intent.ACTION_CALL);//给意图对象添加一个拨打电话的动作
intent.setData(Uri.parse("tel:"+num));//给意图对象添加执行动作的数据
intent);//用意图对象当参数启动拨打电话的Activity,实际是sentMSN调用的内部一个方法去执行
}
});
}
2. 通过内部类实现
class MyOnClickListener implementsOnClickListener {
//定义监听到事件促发要运行的方法-拨打电话
public void
//在方法中获得电话号码
et.getText().toString();
//调用android的对象的api,拨打电话.
new Intent();//创建一个意图对象
intent.setAction(Intent.ACTION_CALL);//给意图对象添加一个拨打电话的动作
intent.setData(Uri.parse("tel:"+num));//给意图对象添加执行动作的数据
startActivity(intent);//用意图对象当参数启动拨打电话的Activity,实际是sentMSN调用的内部一个方法去执行
}
}
3. 直接在xml给View(视图)元素添加事件,并在类中定义事件促发的动作.
public class SentMSNActivity extends
private EditText et;
private EditText etMSN;
public void
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获得EditText对象以便获得其内容
et = (EditText)findViewById(R.id.callET);
etMSN = (EditText)findViewById(R.id.callETMSN);
}
public void
//定义监听到事件促发要运行的方法-拨打电话
public void
//在方法中获得电话号码
et.getText().toString();
//调用android的对象的api,拨打电话.
new Intent();//创建一个意图对象
intent.setAction(Intent.ACTION_CALL);//给意图对象添加一个拨打电话的动作
intent.setData(Uri.parse("tel:"+num));//给意图对象添加执行动作的数据
startActivity(intent);//用意图对象当参数启动拨打电话的Activity,实际是sentMSN调用的内部一个方法去执行
}
}
4. 让MainActivity实现监听器接口