1入门 投身新领域 2
欢迎来到Android世界 2
Android平台剖析 3
我们要做的工作 4
你的开发环境 5
安装Android Studio 6
构建一个基本应用 7
如何构建应用 8
活动和布局概览 12
如何构建应用(续) 13
你已经创建了你的第一个Android应用 15
Android Studio会为你创建一个完整的文件夹结构 16
工程中的有用文件 17
用Android Studio编辑器编辑代码 18
在Android模拟器上运行应用 23
创建Android虚拟设备 24
在模拟器中运行应用 27
可以在控制台上查看进度 28
发生了什么 30
改进应用 31
布局里有什么 32
activity_main.xml包含两个元素 33
更新布局中显示的文本 34
试一试应用 35
你的Android工具箱 36
2构建交互式应用 真正有用的应用 38
构建一个啤酒荐酒师应用 38
创建工程 40
我们已经创建了默认活动和布局 41
详细介绍设计编辑器 42
使用设计编辑器增加一个按钮 43
activity_find_beer.xml有一个新按钮 44
仔细查看布局代码 45
试一试应用 49
硬编码文本很难实现本地化 50
创建字符串资源 51
在布局中使用字符串资源 52
activity_find_beer.xml的代码 53
向spinner增加值 56
向strings.xml增加string-array 57
试一试spinner 58
需要让按钮做些事情 59
让按钮调用一个方法 60
活动代码 61
为活动增加onClickFindBeer()方法 62
onClickFindBeer()需要做些什么 63
一旦有了View,就能访问它的方法 64
更新活动代码 65
活动的第一个版本 67
这些代码做什么 68
构建定制Java类 70
运行代码时发生了什么 74
试一试应用 75
你的Android工具箱 76
3多个活动和意图 说出你的意图 78
应用可以包含多个活动 78
应用结构 79
开始吧:创建工程 79
更新布局 80
创建第二个活动和布局 82
认识Android清单文件 84
意图是一个消息类型 86
运行应用时会发生什么 88
向第二个活动传递文本 90
更新文本视图属性 91
putExtra()在意图中增加额外的信息 92
更新CreateMessageActivity代码 95
让ReceiveMessageActivity使用意图中的信息 96
用户单击Send Message按钮时发生了什么 97
可以修改应用向其他人发送消息 98
Android应用如何工作 99
创建意图指定一个动作 101
修改意图来使用动作 102
Android如何使用意图过滤器 106
如果总是想让用户选择活动该怎么做 112
调用createChooser()时发生了什么 113
修改代码创建选择器 115
你的Android工具箱 118
4活动生命周期 活动的一生 120
活动到底如何工作 120
秒表应用 122
增加字符串资源 123
活动代码如何工作 125
为按钮增加代码 126
runTimer()方法 127
完整的runTimer()代码 129
完整的StopwatchActivity代码 130
旋转屏幕会改变设备配置 136
活动的状态 137
活动生命周期:从创建到撤销 138
更新的StopwatchActivity代码 142
运行应用时发生了什么 143
活动的生命中不只是有创建和撤销 146
更新的StopwatchActivity代码 151
运行应用时会发生什么 152
不过如果应用只是部分可见会怎么样 154
活动生命周期:前台生命期 155
如果活动暂停就停止秒表 158
实现onPause()和onResume()方法 159
完整的活动代码 160
运行应用时发生了什么 163
生命周期方法快速指南 167
你的Android工具箱 168
5视图和视图组 享受视图 170
用户界面由布局和GUI组件组成 170
LinearLayout将视图显示在一行或一列中 171
增加尺寸资源文件为不同布局指定一致的内边距 174
使用外边距增加视图间的距离 176
调整基本线性布局 177
增加权重扩展视图 179
android:gravity属性的可用值 183
完整的线性布局代码 186
帧布局叠放视图 188
为工程增加一个图像 189
嵌套布局的完整代码 192
FrameLayout:小结 193
使用视图 201
可编辑文本视图 202
开关按钮 204
开关 205
复选框 206
单选钮 208
Spinner 210
图像视图 211
为按钮增加图像 213
滚动视图 215
toast 216
你的Android工具箱 220
6约束布局 集中在一起 222
嵌套布局可能效率很低 222
引入约束布局 223
确保你的工程包含约束布局库 224
向strings.xml增加字符串资源 225
使用蓝图工具 226
使用约束指定视图位置 227
增加一个垂直约束 228
对蓝图的改变会反映到XML中 229
如何让视图居中 230
通过更新偏差调整视图的位置 231
如何改变视图的大小 232
如何对齐视图 238
建立一个真正的布局 239
首先,增加上面一行视图 240
推导约束特性会猜测要增加哪些约束 241
为蓝图增加下一行…… 242
最后,为消息增加一个视图 243
试一试应用 244
你的Android工具箱 245
7列表视图和适配器 合理组织 248
所有应用都从想法开始 248
使用ListView导航到数据 251
饮料详细信息活动 253
Starbuzz应用结构 254
Drink类 256
顶级布局包含一个图像和一个列表 258
完整的顶级布局代码 260
利用监听器让列表视图响应单击 261
为列表视图设置监听器 262
类别活动显示一个类别的数据 267
更新activity_drink_category.xml 268
非静态数据要使用适配器 269
用数组适配器连接列表视图和数组 270
为DrinkCategory Activity增加数组适配器 271
应用回顾:我们做了哪些工作 274
如何在TopLevelActivity中处理单击 276
完整的DrinkCategory Activity代码 278
用数据更新视图 281
DrinkActivity代码 283
运行应用时发生了什么 284
你的Android工具箱 288
8支持库和应用条 走捷径 290
好应用都有清晰的结构 290
不同类型的导航 291
应用主题来增加应用条 293
创建披萨应用 295
增加v7 AppCompat支持库 296
AndroidManifest.xml可以改变应用条的外观 299
如何应用主题 300
在样式资源文件中定义样式 301
定制应用的外观 303
在颜色资源文件中定义颜色 304
activity_main.xml的代码 305
ActionBar与Toolbar比较 306
在活动布局中包含工具条 312
为应用条增加动作 315
增加标签来改变应用条文本 318
AndroidManifest.xml的代码 319
控制动作的外观 322
完整的MainActivity.java代码 325
启用向上导航 327
在应用条上共享内容 331
为menu_ main.xml增加一个共享动作提供者 332
用意图指定内容 333
完整的MainActivity.java代码 334
你的Android工具箱 337
9片段 模块化 340
你的应用在所有设备上都要表现良好 340
应用可能还要有不同的行为 341
片段支持重用代码 342
应用的手机版本 343
创建工程和活动 345
为MainActivity的布局增加一个按钮 346
如何向工程增加片段 348
片段的onCreateView()方法 350
向活动布局增加片段 352
让片段与活动交互 359
Workout类 360
向片段传递训练项目ID 361
让活动设置训练项目ID 363
片段生命周期 365
在片段的onStart()方法中设置视图的值 367
如何创建列表片段 374
更新的WorkoutListFragment代码 377
activity_main.xml的代码 381
连接列表和详细信息 384
WorkoutListFragment.java的代码 387
MainActivity需要实现接口 388
DetailActivity需要向WorkoutDetailFragment传递ID 389
你的Android工具箱 392
10面向更大界面的片段 不同大小,不同界面 394
Workout用在手机和平板电脑上看上去是一样的 394
面向更大界面的设计 395
应用的手机版本 396
应用的平板电脑版本 397
创建一个平板电脑AVD 399
将屏幕特定资源放在屏幕特定文件夹中 402
不同的文件夹选项 403
平板电脑使用layout-large文件夹中的布局 408
更新后的代码会做什么 410
我们要修改itemClicked()代码 412
希望片段处理后退按钮 413
认识后退堆栈 414
后退堆栈事务并不只是活动 415
通过编程使用帧布局替换片段 416
利用布局差别区分设备使用的布局 417
修改后的MainActivity代码 418
使用片段事务 419
更新的MainActivity代码 423
旋转平板电脑时应用会出问题 427
(再谈)保存活动的状态 428
更新的WorkoutDetailFragment.java代码 430
你的Android工具箱 432
11动态片段 嵌套片段 434
增加动态片段 434
应用的新版本 436
创建TempActivity 437
TempActivity需要扩AppCompatActivity 438
StopwatchFragment.java的代码 444
StopwatchFragment布局 447
将StopwatchFragment增加到TempActivity的布局 449
onClick属性调用活动中的方法,而不是片段的方法 452
将OnClickListener关联到按钮 457
StopwatchFragment代码 458
旋转设备会重置秒表 462
对静态片段使用〈fragment〉…… 463
修改activity_temp.xml来使用FrameLayout 464
TempActivity.java的完整代码 467
为WorkoutDetailFragment增加秒表 469
完整的WorkoutDetailFragment.java代码 476
你的Android工具箱 480
12设计支持库 向右滑动 482
再来看披萨应用 482
应用结构 483
使用视图分页控件在片段间滑动 489
为MainActivity的布局增加一个视图分页控件 490
使用片段分页控件适配器让视图分页控件了解页面 491
片段分页控件适配器的代码 492
完整的MainActivity java代码 494
为MainActivity增加标签页导航 498
如何向布局增加标签页 499
将标签页布局关联到视图分页控件 501
完整的MainActivity.java代码 502
设计支持库帮助你实现材料设计 506
让工具条响应滚动 508
向MainActivity的布局增加一个协调器布局 509
如何协调滚动行为 510
为TopFragment增加可滚动的内容 512
完整的fragment_top.xml代码 515
向OrderActivity增加折叠工具条 517
如何创建一个普通的折叠工具条 518
如何为折叠工具条增加图像 523
更新后的activity_order.xml代码 524
FAB和snackbar 526
更新后的activity_order.xml代码 528
完整的OrderActivity.java代码 533
你的Android工具箱 535
13回收视图和卡片视图 回收 538
披萨应用还有工作要做 538
回收视图概览 539
增加披萨数据 541
在卡片中显示披萨数据 542
如何创建卡片视图 543
完整的card captioned_image.xml代码 544
增加回收视图适配器 546
定义适配器的视图持有者 548
覆盖onCreateViewHolder()方法 549
为卡片视图增加数据 550
完整的CaptionedImagesAdapterjava代码 551
创建回收视图 553
为PizzaFragment的布局增加RecyclerView 554
完整的PizzaFragment.java代码 555
回收视图使用一个布局管理器排列视图 556
指定布局管理器 557
完整的PizzaFragment.java代码 558
让回收视图响应单击 566
创建PizzaDetailActivity 567
PizzaDetailActivity.java的代码 569
让回收视图响应单击 570
可以从适配器监听视图事件 571
使你的适配器可重用 572
为适配器增加接口 573
PizzaFragment.java中实现监听器 575
你的Android工具箱 578
14导航抽屉 周游世界 580
标签页布局允许用户轻松导航…… 580
我们要为一个新email应用创建一个导航抽屉 581
导航抽屉解析 582
创建CatChat工程 584
创建InboxFragment 585
创建DraftsFragment 586
创建SentItemsFragment 587
创建TrashFragment 588
创建一个工具条布局 589
更新应用的主题 590
创建HelpActivity 591
创建FeedbackActivity 592
创建导航抽屉头部 594
完整的nav header.xml代码 595
如何分组 598
把支持区段增加为一个子菜单 600
完整的menu nav.xml代码 601
如何创建导航抽屉 602
完整的activity_main.xml代码 603
为MainActivity的帧布局增加InboxFragment 604
增加抽屉开关 607
用户点击抽屉中的菜单项时做出响应 608
实现onNavigationItemSelected()方法 609
用户按后退按钮时关闭抽屉 614
完整的MainActivity.java代码 615
你的Android工具箱 619
15SQLite数据库 启动数据库 622
再来看Starbuzz 622
Android使用SQLite数据库持久存储数据 623
Android提供了一些SQLite类 624
当前的Starbuzz应用结构 625
修改应用来使用数据库 626
SQLite帮助器管理数据库 627
创建SQLite帮助器 628
SQLite数据库内部 630
使用结构化查询语言(SQL)创建表 631
使用insert()方法插入数据 632
插入多个记录 633
StarbuzzDatabaseHelper代码 634
SQLite帮助器代码会做什么 635
如果想要修改数据库呢? 636
SQLite数据库有一个版本号 637
改变版本号时会发生什么 638
用onUpgrade()升级数据库 640
用onDowngrade()降级数据库 641
下面来升级数据库 642
升级现有的数据库 645
用update()方法更新记录 646
对多个列应用条件 647
修改数据库结构 649
删除表 650
完整的SQLite帮助器代码 651
你的Android工具箱 656
16基本游标 取出数据 658
目前为止完成的工作…… 658
Starbuzz应用的新结构 659
如何修改DrinkActivi来使用Starbuzz数据库 660
目前的DrinkActivity代码 661
得到数据库引用 662
用游标从数据库获取数据 663
从一个表返回所有记录 664
以特定顺序返回记录 665
返回选择的记录 666
到目前为止的DrinkActivity代码 669
要从游标读取记录,首先需要导航到这个记录 670
导航游标 671
获取游标值 672
DrinkActivity代码 673
目前为止完成的工作 675
目前的DrinkCategoryActivity代码 677
得到Starbuzz数据库的一个引用…… 678
如何替换列表视图中的数组数据? 679
简单游标适配器将游标数据映射到视图 680
如何使用简单游标适配器 681
关闭游标和数据库 682
未完,继续 683
修改后的DrinkCategory Activity代码 688
DrinkCategory Activity代码(续) 689
你的Android工具箱 691
17游标与asynctasks 保持在后台 694
我们希望Starbuzz应用更新数据库数据 694
向DrinkActivity的布局增加一个复选框 696
显示FAVORITE列的值 697
响应单击事件来更新数据库 698
完整的DrinkActivity.java代码 701
在TopLevelActivity中显示用户的最爱 705
重构TopLevelActivity.java 707
新的TopLevelActivity.java代码 710
用changeCursor()改变游标 715
哪些代码在哪个线程中运行? 723
AsyncTask完成异步任务 724
onPreExecute()方法 725
doInBackground()方法 726
onProgressUpdate()方法 727
onPostExecute()方法 728
AsyncTask类 729
完整的UpdateDrinkTask类 730
完整的DrinkActivity java代码 732
你的Android工具箱 737
AsyncTask步骤小结 737
18启动式服务 愿意为您效劳 740
服务在后台工作 740
创建一个启动式服务 741
使用IntentService类创建一个基本启动式服务 742
如何记录消息日志 743
完整的DelayedMessageService代码 744
在AndroidManifest.xml中声明服务 745
为activity_main.xml增加一个按钮 746
使用startService()启动服务 747
启动式服务的状态 750
启动式服务生命周期:从创建到撤销 751
服务继承了生命周期方法 752
Android有一个内置的通知服务 755
我们将使用AppCompat支持库的通知 756
创建一个通知生成器 757
使用内置通知服务发出通知 759
完整的DelayedMessageService.java代码 760
你的Android工具箱 765
19绑定式服务和权限 绑定在一起 768
绑定式服务绑定到其他组件 768
创建一个新服务 770
实现一个绑定器 771
为服务增加一个getDistance()方法 772
更新MainActivity的布局 773
创建一个ServiceConnection 775
使用bindService()绑定服务 778
使用unbindService()与服务解除绑定 779
调用OdometerService的getDistance()方法 780
完整的MainActivity java代码 781
绑定式服务的状态 787
增加AppCompat支持库 790
为OdometerService增加位置监听器 792
更新的OdometerService代码 795
计算走过的距离 796
完整的OdometerService.java代码 798
让应用请求权限 802
检查用户对权限请求的响应 805
将通知代码增加到onRequestPermissionsResults() 809
完整的MainActivity.java代码 811
你的Android工具箱 815
很高兴你能来到Android世界 816
1.发布你的应用 862
2.内容提供者 863
3.加载器 864
4.同步适配器 864
5.广播 865
6.WebView类 866
7.设置 867
8.动画 868
9.APP部件 869
10.自动测试 870