зачем нам нужно создавать представления в Android?

#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