准备工作

  • 创建名字为 Practice Set 2的 APP
  • 该 Project启动后,打开 activity_main.xml,打开侧边栏的 Preview,手机上能显示Hello World!,表示准备工作完成

Part 1——变量的声明和初始化

  • 变量的声明:

    1
    int total;
  • 变量的初始化:

    1
    total = 10;
  • 变量的声明和初始化同时进行:

    1
    int total = 10;
  • 局部变量必须先初始化才可以使用

  • Java 保留字不能用作变量名,如:int
  • 变量名使用驼峰格式:首字母小写,单词头大写,增强可读性
  • 变量名中不能包含特殊字符,如:''""空格
  • String 不是基本数据类型,它是一个

Part 2——使用变量

  • 手动模拟,像电脑一样,一行一行分析代码,可以帮助追踪、观察变量
  • 查看程序的完成目前时,考虑自己的解决步骤,想想自己怎么解决问题
  • 可以使用( )来改变运算的优先级
  • 使用 + 可以连接字符串
  • 小贴士:Email 地址是区分大小写的哦

Part 3——变量的作用域

  • 作用域是用于区分局部变量和全局变量
  • 局部变量只在定义它的代码块有效,一般是函数
  • 全局变量在程序的全部都有效
  • 局部变量在函数执行完后,会自动消亡,不能再使用了
  • 局部变量不能保存两次投票之间的数据
  • 局部变量必须初始化后才可以使用
  • 全局变量不要滥用,能用局部变量就用局部变量
  • 全局变量创建后,有默认值。String 的默认值是 “”,也就是空字符串

Part 4——篮球计分器

  • APP 介绍

    1. 名字 Court Counter
    2. 3分线外得分,+3
    3. 3分线内得分,+2
    4. 罚球得分,+1
    5. 比分动态显示
    6. RESET 按钮,比分清零
  • 分析问题

    1. 用那些 views
    2. 如何布置 views,也就是选择哪种类型的 ViewGroups
    3. view 风格(美化)
    4. 提示:可以使用 gravitylayout_gravity 来居中和对齐
  • 该项目完成后的效果图
    效果图

项目实践

根据目标效果图,在不看 PS2-part2视频的情况下,自行查找资料,编码,在手机上运行情况如下图:

图2

实现的功能
    1. 所有views 都放置到屏幕上
    2. 按下按钮,能正常计分
    3. 得分可以动态显示
    4. 按下 RESET 按钮,分数可以清零
未实现的功能
    1. 屏幕中间没有分割线
    2. RESET 按钮没有位于屏幕底部

跟着视频走,特别留意自己未实现的功能

  • 循序渐进,逐步增加功能
    1. 只显示 Team A 相关的 views,按按钮显示对应得分
    2. 使用全局变量 scoreTeamA保存 Team A 的分数(初始值为 0)
    3. 每次点击+3 POINTS按钮,分数按相应值增加3
      • 先增加分数
      • 显示分数
      • 注意:交换次序后,显示的是上次的得分哦
      • 代码如下:
        public void teamAGetThree(View view) {
        teamAScore += 3;
        displayTeamAScore(teamAScore);
        }
    4. 按照上面的方法,增加代码,使按另外2个按钮,分数也可以增加,并动态显示
      图3
    5. 修改xml代码,增加 Team B相应的列(把 Team A相关的 views 当作一个大 view; Team B相关的 views 当作另一个大 view)
    6. 使用 LinearLayout来实现,并用layout_weight来实现2个 ViewGroup一样大
      • 注意: 此处,和我的此前的想法有别,我是把每一行当作一个 LinearLayout
      • 用视频中的思路重写代码
    7. 简单复制 Team A的相关xml代码,存在一个问题:按Team B 的按钮,分数增加到了Team A上
    8. 解决7中存在的问题
      • 修改 Team B的onClick方法
      • 增加一个全局变量 teamBScore
      • 增加3个函数更新并显示得分情况
        图4
    9. 增加 RESET 按钮(点击按钮,得分清零)
      • 把上面的 VireGroups当作一个大视图
      • 利用 RelativeLayout 把大视图和 RESET 按钮组合在一起
    10. 比较不同代码的实现方式,看哪种更简洁高效
    11. 修改 styles.xml 文件,让界面看起来更漂亮
      • 样式文件负责引用的基本格式
      • 修改styles.xml后,可以对所有的元素生效,而不需要单独设置每个的 style
      • 需要 API 21以上有效,否则显示灰色
    12. 增加分割线
      图5

注意:

  • 出现编译时错误,编译器不允许运行代码
  • 程序逻辑不正确,会导致运行结果出错

总结

  • LinearLayout 中的 gravity 属性是调整view中 text的位置(靠右、居中、水平居中等)
  • padding 属性是在 view 里面加 padding
  • margin 属性是在 view 的边框外加间隙
  • constant 常量,值不变的量

  • 刚看完PS1的 part1后,就立即着手开发APP了,但是自己的思路和视频的思路还是不一样的。

    相同的地方

    最大的 ViewGroups 都使用了 RelativeLayout

不同的地方

我把每一行当作一个 LinearLayout来处理
视频讲师把 每一个 Team 作为一个 LinearLayout来处理 
  • view这种视图是以前未见过的,没有了解,在视频中,部分代码经常被遮挡,无法抄写,需要自行搜索解决
  • 虽然两者都可以实现该 APP 的功能,但从程序模块化、以及后期扩展来说,视频导师的分析办法,便于扩展,结构清晰,值得学习!
  • 总体来讲,虽然,该 APP 中用到的 View 层次比较多,但只要搞清楚父子关系,代码组织起来就很轻松了。
  • 每节课结尾对成功 APP 的介绍非常有用,让准备开发 Android 应用的人知道:从用户的需求出发,开发对社会有用的应用

  • 一杯咖啡,送给亲爱的 Lyla 及所有为 Study Jams 活动付出汗水的人们!
    cheers