Russian subtitles

← Casting with findViewById

Get Embed Code
13 Languages

Showing Revision 3 created 12/16/2015 by Fran Ontanaya.

  1. Я добавила код, который мы
    выучили, в приложение.
  2. Он гласит View orderSummaryTextView
    = findViewById
    ,
  3. затем вводим идентификатор для
    order_summary_text_view.
  4. Но это приводит к ошибке в Android
    Studio в следующей строке.
  5. Тут говорится, что нельзя решить
    метод setText.
  6. Если я добавлю еще одну
    строку кода здесь,
  7. я покажу вам типы методов,
    действительные в этой переменной.
  8. Мы только что создали переменную
    orderSummaryTextView,
  9. и она TypeView, и поэтому
  10. в следующей строке мы сможем
    вызывать на нее метод.
  11. Но если взглянуть на предложения
    автозаполнения,
  12. эти методы являются методами View.
  13. Нет конкретных методов TextView.
  14. Например, здест нет ни одного
    метода setText.
  15. Поэтому мы получаем тут ошибку,
    пытаясь вызвать setText.
  16. И вы также не можете задать размер
    текста, цвет или что-то из этого.
  17. Так где же все эти методы?
  18. Дело в том, что TextView - более
    конкретный тип элемента View.
  19. Поэтому, если мы хотим вызвать
    методы TextView на этот объект,
  20. нам надо убедиться, что это объект
    элемента TextView.
  21. Итак, переменная является
    объектом TextView.
  22. Но появляется другая ошибка: несов-
    местимые типы, потому что TextView
  23. должен быть справа, но мы тут видим
    только обычный View.
  24. That's because the findViewById
    method returns a View.
  25. Как же нам это согласовать?
  26. Раз TextView - более конкретный тип
    элемента View или, если по-другому
  27. TextView это подкласс View,
    мы можем сделать кое-что c названием
  28. приведение типов. В Java это значит -
    мы можем взять View, возвращенный
  29. этим методом,
    и считать его за TextView.
  30. Теперь правая сторона является
    объектом TextView и
  31. затем можно хранить его внутри этой
    переменной orderSummaryTextView.
  32. Знаю, кажется пугающим, потому что
    я только что назвала
  33. тонну новых понятий.
  34. Давайте объясню еще раз.
  35. Метод findViewById превращает
    объект в тип View.
  36. Записав это обозначение в скобках,
  37. указав в них нужный
    тип данных объекта,
  38. мы приводим этот View в TextView.
  39. Таким образом, все выражение здесь
    оценивается как объект TextView.
  40. Мы можем хранить это
    в переменной слева,
  41. а это orderSummary TextView,
    и у него тип 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. вводим идентификатор ресурса
    для quantity_Text_View.
  58. Это возвращает View, и мы переводим
    его в TextView, и
  59. можем хранить это внутри переменной
    под названием quantityTextView.
  60. У этой перменной тип
    TextView, и поэтому
  61. в следующих строках мы можем вызвать на
    нее методы TextView, например, setText.
  62. Вот обновленный код MainActivity,
    использующий приведение типа.
  63. Мы можем привести эти Views в
    TextViews, чтобы хранить в переменных
  64. с типом TextView. В этом списке
    MainActivity переменных
  65. quantityTextView и orderSummaryTextView
    являются типом TextView.
  66. На них мы можем вызывать
    методы TextView,
  67. и мы не ограничены тем, чтобы считать
    их только типом View.
  68. А теперь мы можем вызвать конкретные
    методы TextView на эти переменные.
  69. Например, мы можем вызвать setText
    на orderSummaryTextView,
  70. и можем вызвать setText
    на quantityTextView.
  71. Как вы видите,
  72. вы должны быть осторожны с тем, какой
    тип данных где используется.
  73. До сих пор, когда мы вызывали методы,
    не думали о возвращаемой величине,
  74. потому что метод setText вообще-то
    не имеет возвращаемой величины.
  75. То же касается и метода
    imageView.setImageResource .
  76. У него нет возвращаемой величины.
  77. Но другие методы могут иметь
    возвращаемые величины.
  78. Например, в классе TextView есть
    метод getTextSize.
  79. Он возвращает целое число, так что
  80. мы можем хранить результат метода в
    переменной размер типа int.
  81. А вот еще метод
    с возвращаемой величиной.
  82. В этом классе Button [кнопка] вы
    можете вызывать метод getHeight,
  83. и он возвращает целое число, которое
    вы можете хранить внутри переменной.
  84. Если вам нужно сохранить результат
    внутри строки, например,
  85. получите сообщение об ошибке, потому
    что метод возвращает целое число.
  86. Чтобы узнать, какой тип данных нужно
    вводить в метод и какой тип данных
  87. возвращается назад из метода, вам
    нужно свериться с документацией.
  88. А, например, в классе TextView,
  89. если вызвать любой из этих методов,
    он возвращает величину типа int.
  90. Тип данных возвращаемой величины
    указан в колонке слева.
  91. В других методах можно получить в виде
    возвращаемой величины пустого значения
  92. или булевого, которые мы не изучали,
    числа с плавающей запятой, длинный
  93. целый тип ... Эта страница документа
    показывает расширенные типы данных
  94. для входных значений
    для каждого метода.
  95. Например, метод setTextColor требует
    целого числа как входного значения,
  96. а возвращаемая величина - void,
    так что возвращаемой величины нет.
  97. Поэтому проверяйте описание, чтобы
    знать, какие типы данных ожидаются.
  98. В противном случае, будете получать
    сообщения об ошибках от
  99. Android Studio о том, что типы
    не сопоставимы.
  100. Вернемся к практике.
  101. Внизу четыре разных примера кодов.
    Некоторые из кодов
  102. могут содержать ошибки, относящиеся
    к несопоставимым типам данных.
  103. Если найдете ошибку,
  104. опишите как ее нужно исправить в
    предоставленных внизу окошках.
  105. Если код совершенно верен, можете
    просто написать "Ошибок нет".
  106. Этот тест довольно сложный,
    потому что мы только что изучили
  107. много понятий и этот код все
    еще довольно новый для вас.
  108. Не спешите и сверьтесь с
    документацией для этих методов.
  109. Убедитесь, что входные значения и
    возвращаемые величины верны,
  110. и что если мы заявляем переменные,
    у нас для них верный тип данных.
  111. Также просмотрите
    документацию на вызов
  112. этих методов, чтобы убедиться,
    что мы используем методы верно.