#android #android-view #findviewbyid
#Android #android-просмотр #findviewbyid
Вопрос:
В onCreateView
методе моего фрагмента я сохранял раздутый макет в переменной, а затем передавал последнюю другим моим функциям, которые вызывались findViewById
для этого раздутого View
.
Теперь я предпочитаю просто возвращать раздутый макет (я его не сохраняю). Таким образом, я не передаю никакого значения другим моим функциям, которые вызывают findViewById
. Но они все равно вызывают findViewById
; как? Просто вызвав Objects.requireNonNull(getActivity()).findViewById
.
Говоря о фрагментах, эквивалентно ли это? Например:
- С точки зрения потребления оперативной памяти или процессора
- С точки зрения поведения (есть ли какой-либо риск при втором способе сделать это?)
Ответ №1:
С точки зрения потребления оперативной памяти или процессора
Прямой просмотр представления фрагмента будет быстрее, потому что вы будете выполнять поиск по более мелкой иерархии. Это не должно вас касаться, это будет незначительно с точки зрения производительности.
С точки зрения поведения (есть ли какой-либо риск при втором способе сделать это?)
Вам не следует использовать getActivity().findViewById(). Фрагмент должен быть независимым и управлять своим представлением напрямую, а не через косвенное обращение (например, getActivity()). Вы также рискуете внести незначительные ошибки из-за способа работы findViewById() (что означает, что он возвращает первое представление с указанным идентификатором, который он нашел).
Представьте, что у вас есть тот же фрагмент, который используется в качестве страниц ViewPager. Использование getActivity().findViewById() означает, что вы будете ссылаться только на представления из первого экземпляра фрагмента, на который ссылается ViewPager (а не на другие страницы). Другим примером может быть, когда у вас есть представление с идентификатором в activity и представление с тем же идентификатором во фрагменте (на более глубоком уровне) . Использование getActivity().findViewById() будет ссылаться на представление activity, а не на представление, найденное во фрагменте.
Комментарии:
1. Спасибо! Другими словами, мы всегда должны сохранять раздутое представление как атрибут класса и использовать его в методах (или сохранять его как
onCreate
переменную ‘s и передавать его методам)?2. @JarsOfJam-Scheduler У вас всегда должен быть фрагмент, работающий напрямую со своим собственным представлением. Вероятно, вы захотите один раз инициализировать все нужные вам представления во фрагменте из расширенного представления и использовать их вместо сохранения ссылки на расширенное представление и вызова findViewById каждый раз, когда вам нужен доступ к одному из его дочерних элементов.