Android 常用adb命令总结
针对移动端Android 的测试,adb命令是很重要的一个点,必须将常用的adb命令熟记于心,将会为Android 测试带来很大的方便,其中很多命令将会用于自动化测试的脚本当中。
Android Debug Bridge
adb其实就是Android Debug Bridge, Android 调试桥的缩写,adb是一个C/S 架构的命令行工具,主要由3 部分组成:
?
?运行在PC 端的Client : 可以通过它对Android 应用进行安装、卸载及调试Eclipse 中的ADT、SDK Tools 目录下的DDMS、Monitor 等工具,都是同样地用到了adb的功能来与
Android 设备进行交互。
?
?PC 端的手机助手,诸如360 手机助手、豌豆荚、应用宝等,其除了安装第三方应用方便,其他的功能,基本上都可以通过adb
命令去完成,这里建议测试人员尽量不要在电脑上安装这类手
机助手,因为其自带的adb程序可能会与Android SDK 下的
adb程序产生冲突,5037 端口被占用,导致使用adb命令时无法连接到设备
?
?运行在PC 端的Service : 其管理客户端到Android 设备上adb后台进程的连接adb服务启动后,Windows 可以在任务
管理器中找到adb.exe 这个进程
?
?运行在Android 设备上的adb后台进程执行adb shell ps | grepadbd,可以找到该后台进程,windows 请使用findstr
替代grep[xuxu:~]$ adb shell ps |
grepadbdroot23227 16672832ffffffff 00019bb4 S /sbin/adbd
?这里注意一个地方,就是adb使用的端口号,5037,有必要记一下?
?接下来我将adb命令分为三部分进行介绍,adb命令、adb shell 命令、linux命令
adb命令
在开发或者测试的过程中,我们可以通过adb来管理多台设备,其一般的格式为:
adb [-e | -d | -s <设备序列号>] <子命令>
在配好环境变量的前提下,在命令窗口当中输入adb help 或者直接输入adb,将会列出所有的选项说明及子命令。
这里介绍一些里面常用的命令:
?
?adb devices , 获取设备列表及设备状态
[xuxu:~]$ adbdevicesList of devices
attached44c826a0device
?
?adb get-state , 获取设备的状态[xuxu:~]$ adb get-statedevice 设备的状态有3 钟,device , offline , unknown
?
?device:设备正常连接
?
?offline:连接出现异常,设备无响应
?
?unknown:没有连接设备
?
?adb kill-server , adb start-server , 结束adb服务,启动adb服务,通常两个命令一起用一般在连接出现异常,使用adb devices
未正常列出设备,设备状态异常时使用kill-server,然后运行
start-server 进行重启服务
?
?adblogcat , 打印Android 的系统日志,这个可以单独拿出来讲?
?adbbugreport , 打印dumpsys、dumpstate、logcat的输出,也是用于分析错误输出比较多,建议重定向到一个文件中
adbbugreport> d:\bugreport.log
?
?adb install , 安装应用,覆盖安装是使用-r 选项windows 下如果需要安装含有中文名的apk,需要对adb进行修改,百度可以
找到做出修改的adb , 支持中文命令的apk,请自行搜索
?
?adb uninstall , 卸载应用,后面跟的参数是应用的包名,请区别于apk文件名'-k' means keep the data and cache directories , -k 选项,卸载时保存数据和缓存目录
?
?adb pull , 将Android 设备上的文件或者文件夹复制到本地
?
?例如复制Sdcard下的pull.txt 文件到D 盘:adb pull sdcard/pull.txt d:\如果需要重命名为rename.txt:adb pull sdcard/pull.txt d:\rename.txt注意权限,复制系统权限
的目录下的文件,需要root ,并且一般的Android 机root 之后并不能使用命令去复制,而需要在手机上使用类似于RE
的文件浏览器,先对系统的文件系统进行挂载为可读写后,才能在手机上复制移动系统文件,这里推荐使用小米手机的开发版本,IUNI 也是不错滴~~
?
?adb push , 推送本地文件至Android 设备
?
?例如推送D 盘下的push.txt 至Sdcard:adb push d:\push.txt sdcard/sdcard后面的斜杠不能少,否则会出现下面的错误:[xuxu:~]$ adb push push.txt sdcardfailed to copy 'push.txt' to 'sdcard': Is a directory权限问题同pull 命令?
?adb root , adb remount, 只针对类似小米开发版的手机有用,可以直接已这两个命令获取root 权限,并挂载系统文件系统为可读写状态
?
?adb reboot , 重启Android 设备bootloader , 重启设备,进入fastboot模式,同adb reboot-bootloader命令
?
?recovery , 重启设备,进入recovery 模式,经常刷机的同学比较熟悉这个模式
?
?adb forward , 将宿主机上的某个端口重定向到设备的某个端口adb forward tcp:1314 tcp :8888
执行该命令后所有发往宿主机1314 端口的消息、数据都会转发到Android 设备的8888 端口上,因此可以通过远程的方式控制Android 设备。
adb shell 命令
有人问过我,为什么会知道这么多的命令,答案就是我比较爱折腾,这里大家先要了解我为什么要区分adb命令和adb shell 命令。
简单点讲,adb命令是adb这个程序自带的一些命令,而adb shell 则是调用的Android 系统中的命令,这些Android 特有的命令都放在了Android 设备的system/bin 目录下,例如我再命令行中敲这样一个命令:
[xuxu:~]$ adb shell hehe/system/bin/sh: hehe: not found很明显,在bin 目录下并不存在这个命令。
自己爱折腾,想看看有哪些命令,也不想去找文档,于是就启动模拟器,将整个system/bin 目录复制了出来,然后一个一个的去试。。囧~~
打开这些文件就可以发现,里面有些命令其实是一个shell 脚本,例如打开monkey 文件:
# Script to start "monkey" on the device, which has a very rudimentary# shell.#base=/systemexport
CLASSPATH=$base/framework/monkey.jartrap "" HUPexecapp_process $base/bin
https://www.wendangku.net/doc/e34530181.html,mands.monkey.Monkey $*再比如打开am:#!/system/bin/sh## Script to start "am" on the device, which has a very rudimentary#
shell.#base=/system export CLASSPATH=$base/framework/am .jar exec app_process$base/bin
https://www.wendangku.net/doc/e34530181.html,mands.am.Am"$@"还有SDK
sources/android-20/com/android/commands 目录下:[xuxu:...oid-20/com/android/commands]$ pwd/Users/xuxu/ut ils/android/android-sdk-macosx/sources/android-20/com/an droid/commands[xuxu:...oid-20/com/android/commands]$ llt otal 0drwxr-xr-x3 xuxu staff102B42 10:57 amdrwxr-xr-x3 xuxu staff102B42 10:57 bmgrdrwxr-xr-x3
xuxu staff102B42 10:57 budrwxr-xr-x3
xuxu staff102B42 10:57 contentdrwxr-xr-x3
xuxu staff102B42 10:57 imedrwxr-xr-x3
xuxu staff102B42 10:57 inputdrwxr-xr-x3
xuxu staff102B42 10:57 mediadrwxr-xr-x3
xuxu staff102B42 10:57 pmdrwxr-xr-x3
xuxu staff102B42 10:57 requestsyncdrwxr-xr-x3
xuxu staff102B42 10:57 settingsdrwxr-xr-x7
xuxu staff238B42 10:57 svcdrwxr-xr-x6
xuxu staff204B42 10:57 uiautomatordrwxr-xr-x3
xuxu staff102B42 10:57 wm有没有熟悉的命令?am 、pm、uiautomator ...
下面介绍一些常用的adb shell 命令(其中pm、am 命令比较庞大,使用四级标题)
pm
Package Manager , 可以用获取到一些安装在Android 设备上得应用信息
pm 的源码Pm.java , 直接运行adb shell pm 可以获取到该命令的帮助信息
?
?pm list package 列出安装在设备上的应用不带任何选项:列出所有的应用的包名(不知道怎么找应用的包名的同学看这里)adb shell pm list package-s:列出系统应用adb shell pm list package -s -3:列出第三方应用adb shell pm list
package -3-f:列出应用包名及对应的apk名及存放位置
adb shell pm list package -f-i:列出应用包名及其安装来源,结果显示例子:
?
?package:com.zhihu.android installer=com.xiaomi.market adb shell pm list package -i命令最后增加FILTER:过滤
关键字,可以很方便地查找自己想要的应用
?参数组合使用,例如,查找三方应用中知乎的包名、apk存放位置、安装来源:[xuxu:~]$ adb shell pm list package -f -3
-izhihupackage:/data/app/com.zhihu.android-1.apk=co
m.zhihu.android installer=com.xiaomi.market
?
?pm path 列出对应包名的 .apk位置[xuxu:~]$ adb shell pm path
com.tencent.mobileqqpackage:/data/app/com.tencent.
mobileqq-1.apk
?
?pm list instrumentation , 列出含有单元测试case 的应用,后面可跟参数-f (与pm list package 中一样),以及
[TARGET-PACKAGE]
?
?pm dump , 后跟包名,列出指定应用的dump 信息,里面有各种信息,自行查看
?adb shell pm dump com.tencent.mobileqqPackages:Package [com.tencent.mobileqq] (4397f810):userId=10091
gids=[3003, 3002, 3001, 1028,
1015]pkg=Package{43851660
com.tencent.mobileqq}codePath=/data/app/com.tence
nt.mobileqq-1.apkresourcePath=/data/app/com.tencent .mobileqq-1.apknativeLibraryPath=/data/app-lib/com.te ncent.mobileqq-1versionCode=242
targetSdk=9versionName=5.6.0applicationInfo=Applica
tionInfo{43842cc8
com.tencent.mobileqq}flags=[ HAS_CODE
ALLOW_CLEAR_USER_DATA ]dataDir=/data/data/com.te ncent.mobileqqsupportsScreens=[small, medium, large,
xlarge, resizeable,
anyDensity]usesOptionalLibraries:com.google.android.m edia.effectscom.motorola.hardware.frontcameratimeSta
mp=2015-05-13 14:04:24firstInstallTime=2015-04-03
20:50:07lastUpdateTime=2015-05-13
14:05:02installerPackageName=com.xiaomi.marketsigna tures=PackageSignatures{4397f8d8
[43980488]}permissionsFixed=true haveGids=true
installStatus=1pkgFlags=[ HAS_CODE
ALLOW_CLEAR_USER_DATA ]User 0:installed=true
blocked=false stopped=false notLaunched=false
enabled=0grantedPermissions:android.permission.CHA
NGE_WIFI_MULTICAST_STATEcom.tencent.qav.permissio n.broadcastcom.tencent.photos.permission.DATAcom.te ncent.wifisdk.permission.disconnect
?
?pm install , 安装应用目标apk存放于PC 端,请用adb install 安装
?
?目标apk存放于Android 设备上,请用pm install 安装
?
?pm uninstall , 卸载应用,同adb uninstall , 后面跟的参数都是应用的包名
?
?pm clear , 清除应用数据
?
?pm set-install-location , pm get-install-location , 设置应用安装位置,获取应用安装位置[0/auto]:默认为自动
?
?[1/internal]:默认为安装在手机内部
?
?[2/external]:默认安装在外部存储
am
又是一个庞大的命令。。。
am 源码Am.java
?
?am start , 启动一个Activity,已启动系统相机应用为例启动相机[xuxu:~]$ adb shell am start -n
com.android.camera/.CameraStarting: Intent
{ cmp=com.android.camera/.Camera }先停止目标应用,再启动[xuxu:~]$ adb shell am start -S
com.android.camera/.CameraStopping:
com.android.cameraStarting: Intent
{ act=android.intent.action.MAIN
cat=[https://www.wendangku.net/doc/e34530181.html,UNCHER]cmp=com.an droid.camera/.Camera }等待应用完成启动
[xuxu:~]$ adb shell am start -W
com.android.camera/.CameraStarting: Intent
{ act=android.intent.action.MAIN
cat=[https://www.wendangku.net/doc/e34530181.html,UNCHER]
cmp=com.android.camera/.Camera }Status: okActivity:
com.android.camera/.CameraThisTime: 500TotalTime:
500Complete启动默认浏览器打开一个网页
[xuxu:~]$ adb shell am start -a
android.intent.action.VIEW -d
https://www.wendangku.net/doc/e34530181.html,Starting: Intent
{ act=android.intent.action.VIEWdat=http://testerhome.
com }启动拨号器拨打10086[xuxu:~]$ adb shell am
start -a android.intent.action.CALL -d tel:10086Starting: Intent { act=android.intent.action.CALLdat=tel:xxxxx } ?
?am instrument , 启动一个instrumentation , 单元测试或者Robotium会用到
?
?am monitor , 监控crash 与ANR[xuxu:~]$ adb shell am monitorMonitoring activity manager...available
commands:(q)uit: finish monitoring** Activity starting:
com.android.camera
?
?am force-stop , 后跟包名,结束应用
?
?am startservice , 启动一个服务
?
?am broadcast , 发送一个广播
还有很多的选项,自己多多发掘~~
input
这个命令可以向Android 设备发送按键事件,其源码Input.java ?
?input text , 发送文本内容,不能发送中文adb shell input text test123456前提先将键盘设置为英文键盘
?
?input keyevent , 发送按键事件,KeyEvent.java adb shell input keyevent KEYCODE_HOME模拟按下Home 键,源码里面
有定义:
?
?public static final int KEYCODE_HOME = 3;
?
?因此可以将命令中的KEYCODE_HOME 替换为3
?
?input tap , 对屏幕发送一个触摸事件adb shell input tap 500 500点击屏幕上坐标为500 500的位置
?
?input swipe , 滑动事件adb shell input swipe 900 500 100 500从右往左滑动屏幕
?
?如果版本不低于4.4 , 可以模拟长按事件adb shell input swipe 500 500 501 501 2000其实就是在小的距离内,在较
长的持续时间内进行滑动,最后表现出来的结果就是长按动作
到这里会发现,MonkeyRunner能做到的事情,通过adb命令都可以做得到,如果进行封装,会比MR 做得更好。
screencap
截图命令
adb shell screencap -p /sdcard/screen.png
截屏,保存至sdcard目录
screenrecord
4.4 新增的录制命令
adb shell screenrecordsdcard/record.mp4
执行命令后操作手机,ctrl + c 结束录制,录制结果保存至sdcard uiautomator
执行UI automation tests ,获取当前界面的控件信息runtest:executes UI automation tests RunTestCommand.java
dump:获取控件信息,DumpCommand.java
[xuxu:~]$ adb shell uiautomatordumpUIhierchary dumped to: /storage/emulated/legacy/window_dump.xml
不加[file] 选项时,默认存放在sdcard下
ime
输入法,Ime.java
[xuxu:~]$ adb shell ime list
-scom.google.android.inputmethod.pinyin/.PinyinIMEcom.bai du.input_mi/.ImeService
列出设备上的输入法
[xuxu:~]$ adb shell ime set
com.baidu.input_mi/.ImeServiceInput method
com.baidu.input_mi/.ImeService selected
选择输入法
wm
Wm.java
[xuxu:~]$ adb shell wmsizePhysical size: 1080x1920
获取设备分辨率
monkey
请参考Android Monkey 的用法
settings
Settings.java,请参考探究下Android4.2 中新增的settings 命令dumpsys
请参考android 中dumpsys 命令使用
log
这个命令很有意思,可以在logcat里面打印你设定的信息,具体用途自己思考!
adb shell log -p d -t xuxu "test adb shell log"
-p:优先级,-t:tag,标签,后面加上message
[xuxu:~]$ adblogcat -v time -s xuxu--------- beginning of
/dev/log/system--------- beginning of /dev/log/main05-15 13:57:10.286 D/xuxu(12646): test adb shell log
getprop
查看Android 设备的参数信息,只运行adb shell getprop,结果以key : value 键值对的形式显示,如要获取某个key 的值:adb shell getpropro.build.version.sdk
获取设备的sdk版本
linux命令
操作你的Android 设备,常用到的命令,只列出,不详解!cat、cd、chmod、cp、date、df、du、grep、kill、ln、ls、lsof、netstat、ping、ps、rm、rmdir、top、touch、重定向符号">" ">>"、管道"|"
有些可能需要使用busybox,另外建议windows 下安装一个Cygwin , 没用过的请百度百科Cygwin
END
补充一个引号的用途:
场景1、在PC 端执行monkey 命令,将信息保存至D 盘monkey.log,会这么写:
adb shell monkey -p com.android.settings 5000 >
d:\monkey.log场景2、在PC 端执行monkey 命令,将信息保存至手机的Sdcard,可能会这么写:
adb shell monkey -p com.android.settings
5000 >sdcard/monkey.log
这里肯定会报错,因为最终是写向了PC 端当前目录的sdcard目录下,而非写向手机的Sdcard
这里需要用上引号:
adb shell "monkey -p com.android.settings 5000 >sdcard/monkey.log"对这些命令都熟悉之后,那么接下来就是综合对编程语言的应用,思考如何用语言去处理这些命令,使得这些命令更加的方便于测试工作。
想要学习移动应用的开发,除了必备的知识要掌握好之外,更多的是要掌握一些核心的基础知识,并且是能够起到关键性作用的知识点,必须是要了解清楚,如果你也是在学习Android开发,下面的核心基础或者对你有一定的帮助! 1.ListView的引入 为什么要采用listview?其实是在数据量过于庞大时,传统的存储方式它是会占用机器大量内存,最终导致OOM异常(内存溢出),listview的出现将会是有效的解决这个弊端的出现。 重点来了listview如何使用呢? res/layout布局文件中定义listview src的java代码里面关心控件findviewbyid(R.id.listview); 创建适配器对象,适配器继承baseAdapter接口 2.构造方法 getCount();控制listview的条目数 getView();得到当前条目视图 View.inflate();布局填充器 设置适配器:setAdapter(adapter); 设置listview列表项的点击事件:setOnClickLinsstener();
通知listview更新数据:adapter.notifyDataSetChanged(); 3.对话框的使用 *普通对话框 *单选对话框 *多选对话框 *进度对话框 *进度条对话框 *自定义对话框 布局填充器:Viewview=View.inflate(Context,https://www.wendangku.net/doc/e34530181.html,yout.dialog,null); 核心API:dialog.setView(view); 4.常见的一些适配器的使用 *数组适配器:ArrayAdapter *简单适配器:SimpleAdapter 5.数据库的常见的事务 为什么需要需要定义数据库事务?最主要的还是为了保证多条操作语句同步执行 6.数据库事务执行流程 db.beginTransaction();开启事务 db.setTransactionSuccessful();设置事务执行成功 db.endTransaction();结束事务 7.样式和主题 样式的作用在单独的UI控件上面 主题的作用它是在activity或者application上 以上的这些功能控件、数据库等这些是开发中必备的功能,在开发中只要这些基本的核心知识都掌握了,那么这对你接下里的进一步开发是比较有帮助的。
android studio 控件常用属性 下面是RelativeLayout各个属性 1.android:layout_above="@id/xxx" --将控件置于给定ID控件之上 2.android:layout_below="@id/xxx" --将控件置于给定ID控件之下 3. android:layout_toLeftOf="@id/xxx" --将控件的右边缘和给定ID控件的左边缘对齐 4.android:layout_toRightOf="@id/xxx" --将控件的左边缘和给定ID控件的右边缘对齐 5. android:layout_alignLeft="@id/xxx" --将控件的左边缘和给定ID控件的左边缘对齐 6.android:layout_alignTop="@id/xxx" --将控件的上边缘和给定ID控件的上边缘对齐 7.android:layout_alignRight="@id/xxx" --将控件的右边缘和给定ID控件的右边缘对齐 8.android:layout_alignBottom="@id/xxx" --将控件的底边缘和给定ID控件的底边缘对齐 9.android:layout_alignParentLeft="true" --将控件的左边缘和父控件的左边缘对齐 10. android:layout_alignParentTop="true" --将控件的上边缘和父控件的上边缘对齐 11. android:layout_alignParentRight="true" --将控件的右边缘和父控件的右边缘对齐 12.android:layout_alignParentBottom="true" --将控件的底边缘和父控件的底边缘对齐 13.android:layout_centerInParent="true" --将控件置于父控件的中心位置 14.android:layout_centerHorizontal="true" --将控件置于水平方向的中心位置 15.android:layout_centerVertical="true" --将控件置于垂直方向的中心位置 android:layout_width 设置组件的宽度 android:layout_height 设置组件的高度 android:id 给组件定义一个id值,供后期使用 android:background 设置组件的背景颜色或背景图片 android:text 设置组件的显示文字 android:textColor 设置组件的显示文字的颜色 android:layout_below 组件在参考组件的下面 android:alignTop 同指定组件的顶平行
Android应用开发基本知识点汇总 Activity 一生命周期 4种状态 running / paused / stopped / killed 生命周期 Activity启动 onCreate -> onStart -> onResume 点Home返回主界面 onPause -> onStop 再次回到原Activity onRestart -> onStart -> onResume 退出Activity onPause -> onStop -> onDestroy 进程优先级前台/可见/服务/后台/空 二任务栈 三启动模式 standard singleTop 栈顶复用 singleTask 栈内复用 singeInstance 四scheme跳转协议 服务器可以定制化告诉App跳转哪个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面 Fragment 一第五大组件 为什么是第五大组件 Fragment相对Activity更节省内存,切换更舒适Fragment加载到Activity的两种方式 静态加载xml 动态加载fragmentTransaction.add(id, fragment, “name”); .commit; FragmentPagerAdapter与FragmentStatePagerAdapter
FragmentStatePagerAdapter在切换时回收内存,适合页面较多的情况FragmentPagerAdapter并没有回收内存,只是detach了Activity 二生命周期 onAttach -> onCreate -> onCreateView -> onViewCreated -> onActivityCreated -> onStart -> onResume -> onPause -> onStop -> onDestroyView -> onDestroy -> onDetach 先创建Activity后创建Fragment,先销毁Fragment后销毁Activity 三Fragment之间的通信 Fragment调用Activity getActivity Activity调用Fragment 接口回调 Fragment调用Fragment方法findFragmentById 四FragmentManager replace add remove Service 一应用场景,与Thread区别 Service是什么后台长时间运行,没有用户界面,运行在主线程,不能有耗时操作 Service与Thread区别 Activity难以与Thread交互,尤其当Activity销毁以后 二开启Service的两种方式 StartService onCreate -> onStartCommand -> onBind -> onDestroy onStartCommand return START_STICKY;
《Android基础应用》 Android常用控件 ?本章任务 ?使用Android开发使用时间组件 ?使用Android开发使用进度条组件 ?使用Android开发创建底部选项卡 ?本章目标 ?了解Android的组件层次结构 ?掌握常用的日期时间类控件 ?掌握常用的几个容器组件 1.Android组件的层次结构 UI组件都是View的子类,View有很多子类,它们之间存在树状的继承关系View及其子类结构图
TextView及其子类结构图
ViewGroup及其子类结构图 其下的子类一般作为容器或布局来使用 FrameLayout及其子类结构图 其下的子类通常作为容器或布局来使用
2.时间控件 2.1日期时间选择器 DatePicker组件可用于输入日期,TimePicker组件可用来选择时间,只能输入小时和分,默认12小时制 DatePicker ●使用onDateChangedListener监听器来获取用户的日期选择 ●使用init对组件进行初始化 ●使用getYear,getMonth,getDayOfMonth方法获得用户选择的年,月,日 TimePicker ●使用onTimeChangedListener监听器获取用户的时间选择 ●使用setIs24HourView设置是否以24小时制显示 ●使用getCurrentHour获得当前的小时数 ●使用getCurrentMinute获得当前的分钟数 示例
示例的实现结果
2.2时钟组件 AnalogClock组件用来以表盘的方式显示当前时间,该表只有时针和分针,DigitClock组件以数字的方式显示当前时间可以显示时分秒,由于DigitClock继承TextView,可以使用TextView 的属性 示例
今天我用自己写的一个Demo 和大家详细介绍一个Android开发中遇到的一些常用系统控件的使用技巧。 1.文本框TextView TextView的作用是用来显示一个文本框,下面我用两种方式为大家呈现TextView,第一种是通过xml布局文件
呈现,第二种是通过代码来呈现,由此可见Android 的界面开发真的是非常灵活。 view plaincopy to clipboardprint? 1. public class TextViewActivity extends Activity { 2. @Override 3. protected void onCreate(Bundle savedInstanceState) { 4. setContentView(https://www.wendangku.net/doc/e34530181.html,yout.textview);
5. 6. LinearLayout ll = (LinearLayout) findViewById(R.id.textviewll); 7. TextView textView = new TextView(this); 8. //设置显示文字 9. textView.setText("从代码中添加一个TextView"); 10. //设置显示颜色 11. textView.setTextColor(Color.WHITE); 12. //设置显示字体大小 13. textView.setTextSize(18); 14. //设置显示背景颜色 15. textView.setBackgroundColor(Color.BLUE); 16. //设置锚点位置 17. textView.setGravity(Gravity.CENTER_VERTICAL|Gravity.CE NTER_HORIZONTAL); 18. //把这个view加入到布局当中 19. ll.addView(textView); 20. 21. super.onCreate(savedInstanceState); 22. } 23. } 1. 2. android常用控件大全 在Android中使用各种控件(View) DatePicker-日期选择控件 TimePicker-时间选择控件 ToggleButton-双状态按钮控件 EditText-可编辑文本控件 ProgressBar-进度条控件 SeekBar-可拖动的进度条控件 AutoCompleteTextView-支持自动完成功能的可编辑文本控件 MultiAutoCompleteTextView-支持自动完成功能的可编辑文本控件,允许输入多值(多值之间会自动地用指定的分隔符分开) ZoomControls-放大/缩小按钮控件 Include-整合控件 VideoView-视频播放控件 WebView-浏览器控件 RatingBar-评分控件 Tab-选项卡控件 Spinner-下拉框控件 Chronometer-计时器控件 ScrollView-滚动条控件 在Android中使用的Layout FrameLayout:里面只可以有一个控件,并且不能设计这个控件的位置,控件会放到左上角 LinearLayout:里面可以放多个控件,但是一行只能放一个控件 TableLayout:这个要和TableRow配合使用,很像html里面的table AbsoluteLayout:里面可以放多个控件,并且可以自己定义控件的x,y的位置 RelativeLayout:里面可以放多个控件,不过控件的位置都是相对位置 (Android界面布局好像还可以直接引用一些view,如ScrollView等) 常用控件: 1,EditText 主要函数:setText/getText设置/获取文本内容,setHint设置缺省显示内容; 2,RadioGroup,RadioButton RadioButton的isChecked()判断是否被选中 获取选中RadioButon的ID:设置 RadioGroup.setOnCheckedChangeListener方法 publiconCheckedChanged(RadioGroupgroup,intcheckedId)//checkedId 是选中RadioButton的ID 3,CheckBox isChecked()判断是否被选中 setOnCheckedChangeListener方法监视选中状态改变情况 4,Spinner a,显示数据 1),硬编码加载 通过setAdapter方法设置类型为 ArrayAdapter(Contextcontext,inttextViewResId,String[]objects) textViewResourceId:显示内容的ViewID默认设置为 https://www.wendangku.net/doc/e34530181.html,yout.simple_spinner_item Android开发日志—常用控件篇(容器控件) android简介: Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。 Android的系统架构和其操作系统一样,采用了分层的架构。 Android结构 从架构图看,Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。 隐藏在每个应用后面的是一系列的服务和系统, 其中包括; 丰富而又可扩展的视图(Views),可以用来构建应用程序,它包括列表(Lists),网格(Grids),文本框(Text boxes),按钮(Buttons),甚至可嵌入的web 浏览器。 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据 资源管理器(Resource Manager)提供非代码资源的访问,如本地字符串,图形,和布局文件(Layout files )。 通知管理器(Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。 Android开发四大组件分别是:活动(Activity):用于表现功能。服务(Service):后台运行服务,不提供界面呈现。广播接收器(BroadcastReceiver):用于接收广播。内容提供商(Content Provider):支持在多个应用中存储和读取数据,相当于数据库。 活动(当前界面视图): 1、关于android进程,说法不正确的是( B ) A、组件运行所在的进程,是由androidManifest.xml决定,它可以指定该组件运行于哪个进程。 B、背景进程是不为用户所见的Activity,但是还会有可能被用户看到,所以它不能被杀死 C、当急需内存时,android会决定优先关闭那些空闲的进程 D、可视进程一般不会不被系统所杀死 2、Matrix类的作用( A ) A、可以存储缩小或放大比列 B、存储文件中的图片信息 C、存储资源中的图片信息 D、存储内存中的图片信息 3、关于主题的说法,错误的是( D ) A、它是属性集合 B、它可以在程序中来设置 C、它通常用于一个Activity或所有Activity上 D、它可以用于单个TextView上 4、setOnTouchEvent 设置返回值为true 和 false有何区别?以下说法较准确是( C ) A、没有区别,都能对事件进行监听 B、设置为true时只能在移动时获得一次监听事件,false则可以多次 C、设置为false是,在处理一次监听事件后,系统将抛弃该次事件 D、返回true表示这个消息已经被处理结束,后续的handler不再接收到这个消息 二、开发技术设计与应用能力部分 注:以下程序均是相关程序或小项目的实现代码,根据每个程序或项目的特性,完成程序空缺部分的内容,使其实现。具体程序代码注释省略。 图1 图2 图3 图4 1)电话实现[主界面如图1] 程序描述:完成手机打电话功能。 public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.wendangku.net/doc/e34530181.html,yout.activity_main); Button btn_call = (Button)this.findViewById(R.id.btn_call); btn_call.setOnClickListener(new btnCall()); } private class btnCall implements OnClickListener (1) { public void onClick(View v) { // TODO Auto-generated method stub EditText et_number = (EditText) MainActivity.this.findViewById(R.id.et_number); String s_number = et_number.getText().toString().trim(); (2) Intent i_call = new Intent(); i_call.setAction(Intent.ACTION_CALL(3)); i_call.setData(Uri.parse("tel:"+s_number)); startActivity(i_call); (4) } } } 2)动画实现[主界面如图2] 程序描述:手机屏幕触摸后演示动画,假设XML文件已经设置好,id资源为:R.drawable.panda public class MainActivity extends Activity { ImageView iv_action; AnimationDrawable ad_action; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.wendangku.net/doc/e34530181.html,yout.activity_main); iv_action = (ImageView)this.findViewById(R.id.iv_action); iv_action.setBackgroundResource(5)(R.drawable.panda); ad_action = (AnimationDrawable) iv_action.getBackground(); } public boolean onTouchEvent(MotionEvent event) { ad_action.start();(6) return super.onTouchEvent(event); } } 3)撕衣服游戏实现 项目描述:划动屏幕时完成撕衣服效果,并产生撕衣服声音(sound.mp3) public class MainActivity extends Activity { ImageView iv_upper; ImageView iv_below; 项目总结 时间过的好快,为期三个月的实训生活即将结束了,每一次的实训我们都受益匪浅,我 们学到的不仅仅是课内还有课外,实训让我们的课内知识得到了巩固,专业知识、编程水平 都有很大的提高,我们非常感谢这次实训。 刚开始二周的高强度的课程安排让我们受益匪浅;接下来的项目实训又让我们可以巩固 了课程。这让我觉得实习生活充实而有意义。 乐淘购物项目和android优化大师,我更好的学习了ui的设计,如何使界面漂亮,美观, 巩固了listview,gridview,的使用,学会了动画进入界面的,和会移动的画廊等等。在这 两个项目中,除了让我明白工作中需要能力,素质,知识之外,更重要的是学会了如何去完 成一个任务,懂得了享受工作。当遇到问题,冷静,想办法一点一点的排除障碍,到最后获 取成功,一种自信心由然而生,这就是工作的乐趣。有时候也需要虚心请教,从别人的身上 真得能学习到不自己没有的东西,每一次的挫折只能使我更接近成功。 音乐播放器项目,我们是七个人组成小组完成的,由组长带领我们,分配任务,每个人, 都发挥自己的长处,更好地去完成任务。对于团队开发来说,团结一致使我深有体会。团队 的合作注重沟通和信任,不能不屑于做小事,永远都要保持亲和诚信,把专业理论运用到具 体实践中,不仅加深我对理论的掌握和 运用,还让我拥有了一次又一次难忘的开发经历,这是也是实训最大的收获。 这次实训对于我以后学习、找工作也真是受益菲浅,在这3个月中让我初步从理性回到 感性的重新认识,也让我初步的认识这个社会,对于以后做人所应把握的方向也有所启发! 相信这些宝贵的经验会成为我今后成功的重要的基石。在此,我非常感谢指导老师和 同学对我的帮助。篇二:android实训报告 通信与电子信息专业实训报告 项目名称:基于android的游戏开发 班级 10通信1班 姓名 学号 指导教师 成绩 实训时间:年月日— 目录 一、实训目的及其意义 (3) 1.1、目的及意义 (3) 1.2、研究现状 (3) 二、实训主要任务、重点及难点 (4) 2.1、任务 (4) 2.2、重点内容及实现途径 (4) 三、实训具体内容及完成的主要工作 (5) 3.1、认识基础开发 (6) 3.2、了解数据存储 (6) 3.3、总体实训过程 (7) 四、实际遇到的困难,解决问题的方法和措施 (8) (一)、所遇问题 (8) (二)、解决方法与措施 (9) 五、心得体会 (9) 1、Intent的Component属性的作用是什么,如何定义此属性? component(组件),指定Intent的的目标组件的类名称。通常Android会根据Intent 中 包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹 配的目标组件。但是,如果component这个属性有指定的话,将直接使用它指定的组件, 而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。Component属性的作用是用来指定Intent的目标组件的类名称。如果Component这个属性被指定了的话,Intent的其它属性都是可选项,Android 会直接使用Component指定目标组件,而不再执行其它查找过程。 在使用时,需要先创建一个ComponentName对象,然后将它设置成Intent对 象的Component的属性。通过setComponent()、setClass()和setClassName() 三种方法都可以设置组件的名称,通过getComponent()方法则可获得设置项。 2、发送广播时,可以通过sendCatagoryBroadcast()方法将Intent对象发送出去( ). (错) 3、Android是什么?( ) 一种操作系统 4、下面关于Android dvm的进程和Linux的进程,应用程序的进程说法正确的是( ) DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。 5、Android操作系统最早由哪个公司研发?( ) Android公司 6、下列中不属于手持设备的是( ) 机顶盒 7、下列不是手机操作系统的是()。Windows Vista 8、到目前为止,Android操作系统的最高版本是哪个?( )Android L 9、安装Android SDK时,可以通过( )在线安装或离线安装。Android sdk manager 10、开发Android应用程序时,一般使用的计算机语言是( ) 。JAVA 11、E/AndroidRuntime(1099): https://www.wendangku.net/doc/e34530181.html,ng.RuntimeException: Unable to instantiate activity ComponentInfo{com.test/com.test.CanvasActivitys}: https://www.wendangku.net/doc/e34530181.html,ng.ClassNotFoundException: com.test.CanvasActivitys in loader dalvik.system.PathClassLoader[/data/app/com.test-1.apk] 这段话是程序报错在LogCat中产生的记录,从中可以分析问题的原因可能在哪里?( ) CanvasActivitys类没有在AndroidManifest中正确申明 12、对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android 需要解析的是那些间接Intent,通过解析,将Intent映射给可以处理此Intent的Activity、IntentReceiver或Service (对) Intent 可以传递View对象(错) Intent起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被 调用者之间的解耦(对) 通过Intent可以删除程序(对) 13、下面退出Activity错误的方法是()。System.exit( ) 14、当启动一个Activity并且新的Activity执行完后需要返回到启动它的Activity来执行 的回调函数是( )。startActivityResult() 15、这是一个资源配置文件,下面描述正确的是? ( )这个shape文件是画一条虚线,实 线段5dp,间隔3dp 16、Toast toast = new Toast(this); toast.setText("今天天气不错\n哈哈"); toast.show(); 上面代码的执行结果是什么( )。代码会抛出异常,因为new出的Toast对象不能再使用setText方法来设置提示框文本 实验二 android基本控件实验 【目的】 熟悉Android常用控件的基本操作,掌握它们的基本使用方法。了解控件之间的构成关系,熟悉适配器的使用原理。 【要求】 1、了解控件的继承关系; 2、掌握适配器的使用; 3、掌握信息提示的实现机制; 4、实现基本界面。 【原理】 1.控件类之间的关系 android.view.View类(视图类)呈现了最基本的UI构造块。View类是Android中的一个超类,几乎包含了所有的屏幕类型,主要负责绘制和事件处理。 Android中控件类的扩展结构如图所示。 View有众多的扩展者,它们大部分是在android.widget包中,这些继承者实际上就是Android 系统中的“控件”。View实际上就是各个控件的基类,创建交互式的图形用户界面的基础。View的直接继承者包括文本视图(TextView)、图像视图(ImageView)、进度条(ProgressBar)等。它们各自又有众多的继承者。每个控件除了继承父类功能之外,一般还具有自己的公有 方法、保护方法、XML属性等。 在Android中使用各种控件的一般情况是在布局文件中可以实现UI的外观,然后在Java文件中实现对各种控件的控制动作。控件类的名称也是它们在布局文件XML中使用的标签名称。 2.控件通用行为和属性 View是Android中所有控件类的基类,因此View中一些内容是所有控件类都具有的通用行为和属性。 提示:由于Java语言不支持多重继承,因此Android控件不可能以基本功能的“排列组合”的方式实现。在这种情况下,为了实现功能的复用,基类的功能往往做得较强,作为控件的祖先类,View所实现的功能也是最多的。 控件类经常在布局文件中使用,因此其可以使用XML属性(XMLAttributes),和Java代码经常具有对应关系。 View作为各种控件的基类,其XML属性所有控件通用,XML属性及其对应的方法如表1所示。 表1 View中的XML属性及其对应的方法 其中,android:id表示控件的标识,通常需要在布局文件中指定这个属性。View中与控件标识相关的几个方法如下所示: public int getId() // 获得控件的id(int类型) 合肥工业大学学生自主实习报告 学号: xxx 姓名: xxx 实习单位: 实习时间:2014年6月22-7月5日 一、实习目的: 1、掌握android系统开发的一些常用知识 2、拥有独立解决开发中遇到问题的能力 3、熟悉android软件开发流程并至少做一个android软件项目。 了解现阶段互联网发展主流,了解移动互联网,认识移动互 联网的发展与展望,认识Android,了解基于Android的应用软件开发方法及其商业流程。把理论与实际结合,通过对理论知识的理解,领悟从而运用到生活实际巩固所学的知识,提高对实际生活的认识,积累经验。使学生在此期间能够初次体会到实际生产中的种种技能与经验,完成一项项目锻炼独立思考及团队合作能力。使学生们进一步加深对所学知识的理解,理论联系实际,巩固所学有关计算机基础理论知识和基本技能,学习有关计算机最新技术方面的应用,增强学生对计算机在社会生活,社会生产中应用的感性认识,深入了解计算机在各个领域中的应用状况。生产实习是学校教学的重要补充部分,是区别于普通学校教育的一个显著特征,是教育教学体系中的一个不可缺少的重要组成部分和不可替代的重要环节。它是与今后的职业生活最直接联系的,学生在生产实习过程中将完成学习到就业的过渡,因此生产实习是培养技能型人才,实现培养目标的主要途径。它不仅是校内教学的延续,而且是校内教学的总结。生产实习一方面巩固了书本上学到的理论知识,另一方面,可获得在书本上不易了解和不易学到的生产现场的实际知识,使我们在实践中得到提高实训环节对于提高学生的综合能力和全面素质具重要意义 二、实习单位:苏州高博培训 Android应用程序开发是以Java语言为基础的,所以需要有扎实的Java基础知识。首先熟悉java基本语法,然后熟悉设计模式等。 a) Java基础语法:看下面的《Java知识点列表》 b)设计模式:由于在Android系统的框架层当中,使用了大量的设计模式,如果没有这个方面的知识,对于Android的理解就会大打折扣。设计模式的种类非常之多(设计模式大概有28种,具体请看设计模式系列),一个一个的全部掌握,是不现实的,必须首先掌握面向对象的基础设计原则,有了这些基础原则的支持,理解android容易很多。 有了这些知识,然后再来学习Android开发,一定会事半功倍。 《Java知识点列表》:这些是别人总结,我只是加些说明。 开发环境: 1 Java SDK 下载和安装 2 环境变量的配置(path和classpath) 编程基础: 3. 标识符命名规范 4 Java数据类型 5 运算符 6 分支语句(if,switch) 7 循环语句(for,while) 8 函数的定义方法 只要是个程序员,都懂。语言之间可以融会贯通。 面向对象基础: 向对象的三个基本特征是:封装、继承、多态 9. 面向对象与面向过程语言之间的区别 10 面向对象基本思想(封装) 封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏 11 类的定义方法 12 对象和类的关系 13 对象的创建方法 14 通过对象使用成员变量和成员函数的方法 15 构造函数的作用 16 函数的重载 17 static 的作用 18 this的作用 面向对象高级: 19 面向对象基本思想(继承) 继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进 1Activity 1.1Activity的概念 是Android应用层开发的四大组件之一,主要负责和用户交互部分,有自己的生命周期,在其上可以布置按钮,文本框等各种控件,简单来说就是Android 的UI部分。 1.2Activity与View的区别 1)Activity是四大组件中唯一一个用来和用户进行交互的组件。可以说 Activity就是android的视图层。 2)如果再细化,Activity相当于视图层中的控制层,是用来控制和管理View 的,真正用来显示和处理事件的实际上是View。 3)每个Activity内部都有一个Window对象, Window对象包含了一个 DecorView(实际上就是FrameLayout),我们通过setContentView给Activity设置显示的View实际上都是加到了DecorView中。 1.3Activity生命周期 1.3.1生命周期主干 1.3.2其他中转方法 1.4Activity启动模式1.4.1四种启动模式 1.4.2配置样例 1.5Activity启动方法 1)在一个Activity中调用startActivity()方法。 直接启动Activity,不带请求码。 2)在一个Activity中调用startActivityForResult()方法。 带请求码启动Activity。 1.6请求码与响应码 2BroadcastReceiver 2.1概念 BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。 2.2应用场景 在Android系统中,广播体现在方方面面: eg: 1.当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动 服务的功能; 2.当锁屏或者点亮屏幕时就会产生一条广播,接收这条广播就可以实现一 些暂停或者开启一些耗电进程的功能。 3.当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做 出提示和保存数据等操作; 4.当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量 低时告知用户及时保存进度; 2.3注册 2.3.1静态注册 2.3.1.1概念 静态注册是在AndroidManifest.xml文件中配置的。 2.3.2动态注册 2.3.2.1概念 动态注册需要在代码中动态的指定广播地址并注册。 2.3.2.2需要注意的事项 RegisterReceiver是android.content.ContextWrapper类中的方法,Activity和Service都继承了ContextWrapper,所以可以直接调用。在实际应 android应用开发技术 一、判断题 1、在同一个资源目录中,可以存在两个文件名相同、扩展名不同的资源文件。(×) 2、Android系统下的文件,可以被本系统里的所有应用程序访问。(×) 3、无论Service是以启动方式还是绑定方式运行,该Service类都要重写onBind方法。(√) 4、一个Intent可以包含多个action。(×) 5、对于有序广播消息,是按照各个BroadcastReceiver注册的顺序先后接收并处理。(×) 6、Android是J2ME的一个实现。(×) 7、Android既是操作系统也是开发平台。(√) 8、Android是通过栈的形式来管理多个Activity的。(√) 9、View是ViewGroup的子类。(×) 10、一个Intent可以包含多个category。(√) 二、单项选择题 1、下面哪个不是Android的界面布局方式?( A ) A、FlowLayout B、LinearLayout C、TableLayout D、RelativeLayout 2、浏览网页使用的Intent的Action是什么?( D ) A、ACTION_CALL B、ACTION_EDIT C、ACTION_SEND D、ACTION_VIEW 3、Android 关于启动方式的service生命周期的onCreate()和onStartCommand()方法,说法正确的是( D ) A、当第一次启动的时候只会调用onCreate()方法 B、当第一次启动的时候只会调用onStartCommand ()方法 C、如果service已经启动,将先后调用onCreate()和onStartCommand ()方法 D、如果service已经启动,只会执行onStartCommand ()方法,不再执行onCreate()方法 4、下列关于ContentProvider的说法错误的是:( B ) A、ContentProvider的作用是实现数据共享和交换 B、要访问ContentProvider,只需调用ContentProvider的增删改查相关方法 C、ContentProvider提供的URI必须以“content://”开头 D、Android对于系统里的音视频、图像、通讯录提供了内置的ContentProvider 5、下列关于继承的哪项叙述是正确的?( D ) A、在Java中类允许多重继承 B、在Java中一个类只能实现一个接口 C、在Java中一个类不能同时继承一个类和实现一个接口 D、在Java中接口允许继承自另一个接口 6、以下哪种方式不能退出当前活动状态的Activity?( C ) A、调用finish()方法 B、单击(返回)按钮 C、单击(回到桌面)按钮 D、Activity运行时出现异常 7、对于TextView,使用哪个属性来设置显示的文本?( B ) A、android:textSize B、android:text C、android:textColor D、android:string 8、要处理Button的点击事件,需要注册哪个监听器?( A ) A、OnClickListener() B、OnButtonClickListener() C、OnButtonListener() D、OnItemClickListener() 9、在下述Java语言语句中,错误 ..的创建数组的方法是( D ) A、int intArray [ ]; intArray=new int[5]; B、int intArray [ ]=new int[5]; C、int [ ] intArray ={1,2,3,4,5}; D、int intArray [5]={1,2,3,4, 5}; 10、以下哪种方式不能退出当前活动状态的Activity?( C ) A、调用finish()方法 B、单击(返回)按钮 C、单击(回到桌面)按钮 D、Activity运行时出现异常 11、对于音乐播放器程序中的播放进度控制,使用哪个控件适合?( C ) A、ProgressBar B、RatingBar 考试知识点(Android闭卷考试) 1.理解Android常见的几种布局。 几种布局的高与宽,制定 LinearLayout,线性布局,布局中的控件在线性方向上依次排列。默认控件水平方向排列。 android:orientation=”horizontal” android:orientation=”vertical” 注意: 当就是水平方向排列,控件宽度不能设置为 android:layout_width="match_parent" 否则控件会把水平方向沾满,其她控件无法会控件覆盖(无法放置) 当就是垂直方向,内部控件不能将android:layout_height="match_parent"指定为match_parent android:layout_weight="1",使用比例方式来指定控件的大小 RelativeLayout,相对布局,就是通过相对定位的方式让布局中控件可以出现在布局的任何位置。 内部控件,三种属性, 属性值就是true或false android:layout_centerHrizontal 水平居中, 属性值就是”@id/*“android:layout_below 在某元素的下方 属性值就是数值 android:layout_marginLeft 离某元素左边缘的距离 是通过添加TableRow、其她组件来控制表格的行数与列数 GridLayout就是Android4、0之后新增的布局管理器,因此正常情况下需要在Android 4、0 之后的版本中才能使用,如果希望在更早的版本中使用的话,需要导入相应的支撑库(v7包的gridlayout包)。 Grid Layout 网格布局,与前面所讲的 Table Layout(表格布局) 有点类似,不过她有很多前者没有的东西,因此也更加好用: - 可以自己设置布局中组件的排列方式 - 可以自定义网格布局有多少行、列 - 可以直接设置组件位于某行某列 - 可以设置组件横跨几行或者几列android常用控件大全
Android开发日志—常用控件篇(android简介和容器控件)
复习材料《Android移动应用开发技术》
ANDROID实训心得体会
Android期末复习题总结
实验二 android基本控件实验
Android实习报告
android开发需要掌握的知识点
Android面试基础知识总结
android应用开发技术复习资料
Android考试知识点考试