#java #android
#java #Android
Вопрос:
Мне просто было интересно, почему мы на самом деле создаем представления, когда мы инициализируем его с помощью метода findViewById(), я имею в виду, что метод findViewById() возвращает обратно, и почему нам нужно привести результат.
TextView txtview;
txtview = (TextView) findViewById(R.id.textViewID);
Ответ №1:
Примечание: вы не инициализируете, вы назначаете там из уже созданного объекта представления с дочерними элементами
В прошлом сигнатура метода была
public View findViewById(@ResId int id)
Было необходимо понизить просмотр из представления в любой подтип (TextView, EditText, ImageView и т. Д.), И Старые статьи все еще используют этот метод.
В наши дни подпись является общей как:
public <T extends View> T findViewById(@ResId int id)
Это означает, что он возвращает значение, приведенное к T, T разрешается с левой стороны объявления присваивания (перед equals), поэтому мы можем просто сделать:
TextView t = view.findViewById(R.id.tv_x);
Значение T — это TextView с левой стороны присваивания.
Также рассмотрим следующую сигнатуру метода:
void x(TextView t, ImageView i)
Вы можете вывести T при вызове этого, в результате чего метод вызывается с помощью Textview и ImageView вместо представления суперкласса:
x(view.findViewById(R.id.tv_x), view.findViewById(R.id.iv_x))
В то время как для этого назначения потребуется понижение:
View v = view.findViewById(R.id.tv_x);
//v.text = "x" HERE we don't know the type was not infered to TextView
((TextView) v).text = "x"; //unsafe downcasting necessary
Ps: предполагаемый тип T небезопасен для просмотра ниже
Ответ №2:
Это приведение на самом деле необязательно. Пожалуйста, проверьте здесь, что этот вызов возвращает view или null в противном случае
В качестве альтернативы, если вы используете привязку представления, вам даже не нужно использовать findViewById