Chinese, Simplified subtitles

← Casting with findViewById

Get Embed Code
13 Languages

Showing Revision 2 created 07/27/2016 by Udacity Robot.

  1. 我把我们刚刚看的代码加入到了应用中
  2. 代码是 View orderSummaryTextView = findViewById
  3. 然后把资源 ID 传给 order_summary_text_view
  4. 但这样的话在 Android Studio 中下一行就会报错
  5. 它说无法解析 setText 方法
  6. 如果我在这添加另一行代码
  7. 它会显示这个变量中有效的方法类型
  8. 我们建立一个 orderSummaryTextView 变量
  9. 它是一个视图类型
  10. 我们能在下一行调用它
  11. 如果你看一下自动补全建议
  12. 会发现这些方法实际上是视图方法
  13. 没有专门针对 TextView 的方法
  14. 比如没有 setText 这个方法
  15. 这就是我们调用 setText 时会报错的原因
  16. 你也不能设置尺寸 颜色 和其他属性
  17. 那么那些方法都在哪?
  18. 其实 TextView 是一种更加具体的 View
  19. 所以如果你想在对象中调用 TextView 方法
  20. 我们需要确保这是一个 TextView 对象
  21. 现在这个变量是一个 TextView 对象
  22. 但是它报错了 它说这个类型不兼容 因为
  23. 右边也必须是 TextView 但只找到一个常规 View
  24. 因为 findViewById 方法返回的是常规 View
  25. 怎么使它们一致呢?
  26. 因为 TextView 是一个更具体的 View 换句话说
  27. TextView 是 View 类的一个子类 我们可以使用类型转换
  28. 在 Java 中类型转换意味着 我们可以把这个方法返回的 View
  29. 转换成一个 TextView
  30. 现在 右边已经是个 TextView 对象了
  31. 然后把它存到 orderSummaryTextView 变量中
  32. 我知道你肯定觉得很迷惑 因为我刚刚
  33. 提到了太多新的概念
  34. 我们尝试解决一下
  35. findViewById 方法会把对象转化成视图类型
  36. 通过写这个标记
  37. 也就是括号和里边的对象数据类型
  38. 我们就把 View 转换成了 TextView
  39. 所以整个表达式计算结果是一个 TextView 对象
  40. 然后 我们可以存储到左边的变量里
  41. 也就是 orderSummary 里 是 TextView 类型
  42. 在下一行 在这个对象中我们可以调用 TextView 方法
  43. 你看到展示在这的所有方法了吗?
  44. setAllCaps setTextSize 等等
  45. 删除这行 因为 setText 可以工作了
  46. 没有报错
  47. 如果你想调用 TextView 方法
  48. 我们需要有一个 TextView 对象
  49. 为了有一个 TextView 对象 我们需要调用 findViewById
  50. 然后把 View 转换成 TextView 格式
  51. 之所以转换后就可以工作了 是因为
  52. 在视图层级结构上这里的这个 View 确实是 TextView
  53. 如果我们想转换成其他的 比如单选按钮 就不可以
  54. 因为 orderSummaryTextView 是 TextView
  55. 我们必须转换成合适的类型
  56. 同样 在 displayQuantity 方法中 我们调用 findViewById
  57. 把资源 ID 传到 quantityTextView 中
  58. 这会返回一个 View 并转化为 TextView
  59. 然后存放到 quantityTextView 变量中
  60. 这个变量是 TextView 类型 所以
  61. 在下一行 我们可以调用 TextView 方法 比如 setText
  62. 这是通过类型转换更新的 MainActivity 代码
  63. 我们可以把这些 View 转换成 TextView 然后就可以把它们存到
  64. TextView 变量中了 在 MainActivity 变量列表中
  65. 现在 quantityTextView 和 orderSummaryTextView 是 TextView 类型
  66. 可以用它们调用 TextView 方法
  67. 我们不能局限于仅把它们当做 View
  68. 现在我们可以用这些变量调用 TextView 专属方法
  69. 比如我们可以在 orderSummaryTextView 上调用 setText 方法
  70. 在 quantityTextView 上也能调用 setText 方法
  71. 正如你看到的
  72. 你必须注意在不同地方使用的数据类型
  73. 目前为止 在你调用方法时 我们还没考虑过返回值
  74. 因为 setText 方法没有返回值
  75. imageView.setImageResource 方法和它一样
  76. 没有返回值
  77. 但是其他方法可以有返回值
  78. 比如在 TextView 类 我们有一个 getTextSize 方法
  79. 它会返回一个整型
  80. 所以我们可以把结果存到一个叫 size 的整型变量中
  81. 这是另一个带返回值的方法
  82. 在 Button 类中你可以调用 getHeight 方法
  83. 这会返回一个整型 你可以把它存到一个变量里
  84. 如果你想把它们存到字符串里
  85. 它会报错 因为方法会返回一个整型
  86. 为了知道方法中传入的数据类型
  87. 和方法返回的数据类型 你需要查阅文档
  88. 比如 TextView 类
  89. 如果你调用这些方法中的任何一个 就会返回一个整型数值
  90. 在左边这一列是返回数据类型
  91. 对于其他的方法 你可能会得到空的或布尔类型的返回值
  92. 这些我们还没学 还有浮点类型和长整型
  93. 这个文档页面还展示了方法所要求的输入
  94. 数据类型
  95. 比如 setTextColor 方法要求输入整型
  96. 返回值是空 所以没有返回值
  97. 可以通过查阅文档来了解要求的输入数据类型
  98. 否则 Android Studio 就会报错
  99. 显示数据类型不匹配
  100. 现在该你练习了
  101. 这是四个不同的代码示例
  102. 有些代码可能出现数据类型不匹配的错误
  103. 如果你找到了
  104. 在下边的框里写一下如何解决
  105. 如果代码是完美的就写上没有错误
  106. 这是一个具有挑战性的问题 因为
  107. 里边涉及很多概念 这些代码对你来说也很陌生
  108. 可以通过查阅文档来学习这些方法
  109. 确保输入和返回值是正确的
  110. 如果声明变量 数据类型要正确
  111. 也可以查阅这些方法的相关文档
  112. 来确保正确使用它们