2013-08-27 4 views
-2

Я хотел бы знать, почему когда-то getActivity.findViewById() работает, а иногда он возвращает null?getActivity.findViewById() или mView.findViewById()

И с myView.findViewById() он работает?

Заранее спасибо :)

+0

Возможно, getActivity был пустым или вы пропустили setContentView перед вызовом findviewbyId. –

+0

Должен ли идентификатор быть в разметке? – nsvir

+0

конечно должно быть .. –

ответ

4

findViewById - это не глобальный поиск View. Он выглядит только в определенных местах. Если не указано значение View (как в примере myView.findViewById()) findViewById будет выглядеть в виде содержимого для Activity или Fragment, с которого вы его вызываете. В противном случае он будет выглядеть в пределах указанного вида.

Вы получите нуль, если вы ищете представление не в том месте - то есть то, что вы ищете, не в том месте, которое вы ищете.

Вот пример: если вы используете ListView, элементы которого вы управляете с Adapter вам нужно будет позвонить findViewbById на надутом макет для indivdual элементов для того, чтобы установить их дочерние представления. Зачем? Потому что ListView начинается пустым. Если вы вызвали findViewById в общем ListActivity, вы бы искали поля списка в неправильном месте, т. Е. Представление содержимого для активности - не макет, который в конечном итоге будет завышен для каждого элемента списка.

0

Я предположив вы в фрагменте и вызова getActivity.findViewById().

Рассматривая исходный код, Activity.findViewById() вызывает findViewById() в окне, которое вызывает findViewById() в своем представлении декора.

Поэтому, когда вы вызываете getActivity.findViewById(), вы ищете подзаголовок своего декора.

Если вы вызываете findViewById() непосредственно в представлении, вы ищете подвью из данного представления.

Так что, если вид не находится в вашем представлении с представлением декора, getActivity.findViewById() вернет значение null, пока будет работать view.findViewById().