@ Ответ LiuWenbin_NO отлично описывает ситуацию.Тем не менее, я подумал, что мог бы добавить больше информации об этом
setContentView
создает экземпляры View
при вызове в функции onCreate
Activity
.Он принимает идентификатор ресурса макета или один View
в качестве параметра и раздувает представление.Чтобы понять более четко, для вашего Activity
достаточно только setContentView
, чтобы экран Android заполнялся статическими представлениями, которые вы спроектировали в файле макета, верно?Следовательно, если вы хотите что-то изменить в своем макете, вы берете ссылки на свои виды и соответственно меняете их.
Listview list;
создает только переменную типа ListView
(обратите внимание, что все экземпляры макета расширяются View
).Когда вы вызвали функцию setContentView
, она создает ссылки на раздутые представления и, используя findViewById
, вы просто получаете ссылки на них.
Ранее нам приходилось приводить к определенным типам представлений при использовании findViewById
, что не требуется для более новых версий Android SDK.Следовательно, объект не был создан, когда вы объявили ListView list
, он был создан, когда вы вызвали setContentView
.
Если вы хотите сначала создать экземпляры ваших представлений, а затем хотите их раздувать, вы можете сделать это также с помощью setContentView
.Например, взгляните на следующий код.
TextView tv = new TextView(this);
setContentView(tv);
// Modify the TextView?
tv.setText("Hello there");
Таким образом, вы можете передать только один экземпляр представления в функцию setContentView
.Следовательно, чтобы получить сложный макет с несколькими элементами управления, вам нужно использовать макет.
Использование ресурсов макета с setContentView
позволяет отделить логику вашего приложения от уровня представления.
Я настоятельно рекомендую эту книгу для лучшего понимания.