Проблемы с жизненным циклом фрагмента и вызовом onCreate для несуществующего фрагмента - PullRequest
3 голосов
/ 07 ноября 2011

Я тестирую фрагменты в Android, и у меня непонятное поведение с жизненным циклом фрагмента. У меня есть действие, которое использует макеты в XML как для альбомного и портретного режимов. У меня есть некоторый код, который обращается к объекту EditText, который определен в одном из макетов фрагмента. Если я запускаю приложение в ландшафтном режиме, все работает. Я получаю доступ к компоненту в методе фрагмента onResume (), чтобы обновить текст.

Согласно документации, метод фрагмента onResume () вызывается, когда фрагмент виден пользователю. Однако, если я поверну экран, этот метод будет вызван снова, даже если этот фрагмент не определен в макете портрета. Этот вызов onCreate вызывает исключение NullPointerException, поскольку этот метод ссылается на объект EditText. Почему метод onResume вызывается для фрагмента, который не является частью нового макета? Как и где это подходящее место для изменения данных макета во фрагменте. Я пробовал onStart, onResume, onActivityCreated и т. Д., Но все, кажется, возвращают ту же ошибку.

Любая помощь будет наиболее ценной.

1 Ответ

3 голосов
/ 07 ноября 2011

Когда вы поворачиваете экран, Android сохраняет ваши фрагменты в Bundle и воссоздает их, когда воссоздает действие. Вот почему вы получаете вызовы к несуществующему (фактически просто невидимому) фрагменту. Вы должны справиться с этой ситуацией в коде фрагмента или просто иметь оба фрагмента в макетах land и port, где вы устанавливаете видимость фрагмента на GONE, если вам это не нужно.

Простой способ проверить, виден ли фрагмент в коде:

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
  }

Если container равно нулю, ваш фрагмент воссоздается из пакета и не будет отображаться (так как контейнера нет). Затем вы должны проверить, является ли getView() нулевым, и соответственно замкнуть ваш код. Это может быть грязно, так что будьте осторожны:)

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