YouTube

Got a YouTube account?

New: enable viewer-created translations and captions on your YouTube channel!

Chinese, Simplified subtitles

← Inheriting Behavior

Get Embed Code
13 Languages

Showing Revision 2 created 08/02/2016 by Udacity Robot.

  1. 让我们先回到 Just Java 应用
  2. 看一下 MainActivity 类下的 displayMessage 方法
  3. 从这里开始更好理解了
  4. 我们认识到我们已经创建了一个叫做 orderSummaryTextView 的变量
  5. 变量的数据类型是 TextView
  6. 但我们到现在还不理解这一部分
  7. 在下一行 在我们在这个 TextView 对象上调用方法
  8. 我们使用在上面声明的相同的变量名
  9. 调用 orderSummaryTextView.setText 方法
  10. 然后我们传入一个字符串作为这个方法的输入
  11. 这个字符串类型的 message 其实是 displayMessage
  12. 方法的输入参数
  13. 现在我们深入了解一下这部分我们不理解的代码
  14. 虽然 findViewById 像是一个方法调用
  15. 因为它在看起来像输入参数的括号前面
  16. 但是 令人感到奇怪的是这个方法没有在类中任何地方定义
  17. 如果我在名字上双击并且按住 Cmd+F 或者
  18. 如果你是 Windows 按住 Ctrl+F 然后我们就能尝试在这个文件中搜索
  19. 我只看到两个 findViewById
  20. 并且它们使用的方式相同
  21. 但是我没有看到叫做 findViewById的方法
  22. 说到这 早先在 MainActivity 类中
  23. 我们调用了 setContentView 方法 但是你在文件中搜索的话
  24. MainActivity 中也没有定义
  25. 那么这些方法在哪里定义的呢?
  26. MainActivity 实际上是一个相当短的文件
  27. 它只有 90 行代码
  28. 但这个类比我们看到的拥有更多的内容
  29. 代码显示 extends AppCompatActivity
  30. 这意味着 MainActivity 类是
  31. AppCompatActivity 类的功能上的一个扩展
  32. 在你的电脑上 如果你看到 ActionBarActive 没关系
  33. 那是一个旧版本
  34. 你应该使用的最新版本是 AppCompatActivity
  35. 而且 AppCompatActivity 是在旧 Android 设备上是
  36. 支持向下兼容的
  37. AppCompatActivity 是 Android Support Library 的一部分
  38. 它允许我们在旧 Android 设备上
  39. 使用 Android最新的 UI 特征
  40. 通过继承 AppCompatActivity 类
  41. MainActivity 免费获得了这里的所有
  42. 的函数 属性和方法
  43. 我们不需要从这里复制粘贴代码
  44. 我们只需要简单的继承这个类就可以
  45. 如果你感兴趣
  46. 你可以通过 Google 搜索更多关于 AppCompatActivity 的信息
  47. 这里是 AppCompatActivity 类的参考文档
  48. 因为我安装了 Chrome 扩展
  49. 所以我可以查看代码
  50. 这就是 AppCompatActivity 类定义的地方
  51. 你可以看到这里有很多的函数
  52. 但是你不需要理解它们是怎样实现的
  53. 你需要知道的是当你继承 AppCompatActivity 时
  54. 你就免费获得了这些函数
  55. 在更高层次中 你可以这样简化
  56. 这是 MainActivity 类的定义
  57. 在这里你定义了一些方法
  58. 当你继承 AppCompatActivity 后 我们能够从
  59. AppCompatActivity 中获得属性和方法
  60. 现在它们并没有真正地添加到 MainActivity 类中
  61. 但是你可以想象它们在这
  62. 因为你也可以引用这些属性和方法
  63. 这就是为什么我们的代码能够引用 setContentView或
  64. findViewById 方法的原因
  65. 因为我们继承了这些方法 所以我们没有在 MainActivity 中定义它们
  66. MainActivity 是在设备上作为屏幕显示用的
  67. 但是我们没有在 MainActivity 中写这部分代码 这也是继承来的
  68. 在类中 我们没有直接拥有 AppCompatActivity 类的属性和方法
  69. 现在我们知道 它们一直在那 我们可以引用它们
  70. 说到继承 有好也有坏
  71. 有时我们想要继承行为 但是
  72. 有时我们只是想稍作修改
  73. 如果你想从继承的类中改变一些行为
  74. 你可以重载这个方法
  75. 你可以在方法上面加上 @override 这样的话电脑
  76. 就知道你不想要从 AppCompatActivity 继承来的方法
  77. 而是想要你自己定义的方法
  78. 这是一个棘手的问题 它需要很多练习
  79. 我们看一个 关于 AppCompatActivity 类的
  80. 重载方法的例子
  81. 这个方法是 onCreate 方法
  82. 通过在 MainActivity 类中重载 oncreate 方法 我们指定
  83. 当这个类调用时 使用的是我们自己的实现
  84. 如果你不理解 不要担心
  85. 我正要给你一个关于面向对象编程概念
  86. 的简短介绍
  87. 你绝对还有一些其他问题
  88. 而且需要阅读很多关于这个的话题 才能充分
  89. 理解它们
  90. 另一个简化 MainActivity 类和 AppCompatActivity 类之间的
  91. 关系的方法是画一个类层次图
  92. 这与视图层次图是不一样的 因为
  93. 视层次图显示的是视图树 就像之前屏幕上显示的那样
  94. 类层次图显示的是不同
  95. Java 类之间的关系
  96. 我们有作为父类的 AppCompatActivity 类
  97. 因为 MainActivity 继承 AppCompatActivity
  98. 它被称为子类
  99. 所以当你看到此种类型定义时 不管继承什么
  100. 它都被称作父类
  101. 这个被称作子类
  102. 如果你创建另一个叫做 DetailActivity 的 activity
  103. 它继承 AppCompatActivity 那么它就是子类
  104. 这个是父类
  105. 这是另一个 Java 继承的例子
  106. 如果你想一下 会发现 TextView ImageView 和
  107. 按钮有一些共同之处
  108. 这些 View 在屏幕上都有宽度和高度
  109. 虽然我们还没学到 但它们都有一个可见属性
  110. 所以它们可以设置成可见或不可见
  111. 还有一些其他的属性 它们是相同的
  112. 除了把这些属性代码写到 TextView 类中
  113. 然后复制到 ImageView 类和按钮类中
  114. 我们有更聪明的做法
  115. 我们可以创建一个 View 类
  116. 提取这些 View 的相同属性 然后把它们放到
  117. View 类中 那样的话代码就可以只写一次
  118. 但是我们怎样把 TextView 类和 view 类
  119. 联系起来呢?
  120. 如果你想到继承 那就对了
  121. 在 TextView.java 文件中 我们将要定义 TextView 类
  122. 然后从 View 类中继承所有的数据和方法
  123. 在 TextView 类中 我们不会有太多的代码
  124. 因为 一部分功能已经在 View 类中实现了
  125. 同样可以应用到 ImageView 类和按钮类
  126. 我们不需要写太多代码
  127. 在这些文件中 我们只需要写 ImageView 与 View
  128. 不同的代码即可
  129. 我认为这里要指明区别 所以 ImageView 类必须指明
  130. ImageView 与 View 类的不同之处
  131. 如果我们不想从 View 类中继承某个行为
  132. 我们只需要在 ImageView 类中指定更新的方法就可以
  133. 或者其他任何类中
  134. 提醒一下在这个例子中的术语
  135. TextView 是子类 View 是父类
  136. 如果我们回到关于 TextView 类的文档说明
  137. 我们实际上已经明白了这部分
  138. TextView 继承 View
  139. 现在我们明白它意味着 我们从 View 类
  140. 继承了所有属性和方法
  141. 下面是类层次图
  142. 它表明 TextView 类继承 View 类
  143. 依次向上 View 类继承 Object 类
  144. 如果你浏览周围 你会发现其他类
  145. EditText 类实质上继承 TextView 类
  146. 所以它从 TextView 类获得行为
  147. 然后添加了一些自己的功能
  148. 所以 EditText 继承 TextView
  149. TextView 继承 View View 继承 Object
  150. 这是类继承图
  151. 这样的例子还有很多 你可以浏览好几个小时
  152. 但是我在 TextView 文档页面只给你看一项
  153. 我只给你演示一下设置可见性的方法
  154. 这是 TextView 类中设置可见性的方法
  155. 它决定 View 是可见还是不可见
  156. 如果我点击这个方法 它实际上把我带到了 View 类
  157. 这里描述了这个方法是做什么的
  158. 你可以看到 TextView 对象有一个设置可见性的方法
  159. 它是继承自 View 类
  160. 所以我们从 View 类免费获得这些功能
  161. 我们刚刚讲了很多新概念
  162. 正常情况下 它会贯穿计算机科学课程的整个学期
  163. 我们将要做一些练习
  164. 希望它能贯穿这些知识点
  165. 但是你要花费很多的时间和练习才能
  166. 掌握这些概念
  167. 第一个练习 我想让你创建一个新的 Android 应用
  168. 因为我们不想弄乱 Just Java 应用
  169. 如果你创建了这个工程 然后运行应用
  170. 如果你创建了你自己的应用 你会看见一个 MainActivity 文件
  171. MainActivity 文件继承自 AppCompatActivity
  172. 在你的 Android Studio 版本中 如果你的 MainActivity
  173. 继承自 ActionBarActivity 也是可以的
  174. 那只是 ActionBarActivity 的一个旧版本
  175. 通过删除这个方法的重载 我们会使用
  176. AppCompatActivity 类中出现的 onCreate 方法
  177. 这个方法的出现表明我们想要在 MainActivity 中
  178. 使 onCreate 有不同的行为
  179. 所以删除它就会回到 AppCompatActivity 类
  180. 中的原始方法
  181. 当你运行应用的时候
  182. 你注意到它与你第一次运行的时候不一样了吗?
  183. 在这个文本框中写下你的答案