Фрагмент обратных вызовов, даже если он не является частью пользовательского интерфейса - PullRequest
0 голосов
/ 23 марта 2012

Я пишу приложение, которое использует фрагменты для пользовательского интерфейса, очень похожее на пример кода Блокнота. У него есть список элементов, а затем редактор для этих элементов. В альбомном режиме фрагменты списка и редактора располагаются рядом, но в портретном режиме в основном действии отображается только список, а редактор отображается при запуске нового действия.

В моем фрагменте редактора у меня есть вызовы findViewById для доступа к отдельным компонентам пользовательского интерфейса (главным образом к полям EditText). В нормальных условиях все это работает нормально, но когда экран поворачивается из альбомной в портретную, а основное действие уничтожается и создается снова, кажется, он вызывает onActivityCreated (плюс другие обратные вызовы) для моего фрагмента редактора, даже если он не является частью отображения сейчас (так как в портретном режиме это просто список, который отображается).

Проблема в том, что findViewById для получения компонентов пользовательского интерфейса возвращает значение NULL (я предполагаю, что фрагмент не отображается). Но почему вообще звонят? Мне везде нужны нулевые проверки, чтобы я не пытался использовать компоненты пользовательского интерфейса, когда их нет на экране.

1 Ответ

0 голосов
/ 23 марта 2012

, когда экран поворачивается из альбомной в портретную, а основное действие уничтожается и создается снова, кажется, что он вызывает onActivityCreated (плюс другие обратные вызовы) для моего фрагмента редактора, даже если он не является частью отображения сейчас (так какв портретном режиме это просто список, который отображается).

Правильно.Android воссоздает все существующие фрагменты во время изменения конфигурации.Или, если фрагмент был добавлен с помощью FragmentTransaction, а вы использовали setRetainInstance(true), точно такой же объект фрагмента сохраняется во время изменения конфигурации.

Но почему вообще выполняются вызовы?

См. Выше.

Проблема в том, что findViewById для получения компонентов пользовательского интерфейса возвращает значение NULL

Вам нужно только вызвать findViewById()в onCreateView(), и там вы знаете, существуют ли «компоненты пользовательского интерфейса», потому что вы создаете их сами.

Мне везде нужны нулевые проверки, чтобы убедиться, что я не пытаюсь ииспользуйте компоненты пользовательского интерфейса, когда их нет на экране.

Затем используйте isVisible() или один из других методов is...() для Fragment.Или используйте setRetainInstance(true), чтобы ваш фрагмент не был уничтожен и воссоздан.Или удалите Fragment (например, в onCreate() действия, если переданный Bundle не является null, и вы сейчас в портрете).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...