Согласно документации API Android, Activity.onRetainNonConfigurationInstance() устарел в пользу Fragment.setRetainInstance().
Однако я столкнулся с двумя отдельными ситуациями, когда Fragment.setRetainInstance() не представляется возможным использовать.
-
Если фрагмент содержит WebView. Согласно Diane Hackborne, вы не можете повторно использовать WebView для изменений конфигурации. Я думаю, это означает, что вам нужно разрешить фрагментации сбрасывать и воссоздавать WebView при повороте экрана и использовать WebView.saveState() и WebView.restoreState(), чтобы восстановить состояние веб-представления.
-
Если фрагмент принадлежит макету, который больше не существует после изменения конфигурации, когда FragmentManager пытается восстановить фрагмент, он будет бросать:
java.lang.IllegalArgumentException: No view found for id 0x7f060091 for fragment
Это может произойти (например), если в ландшафтном режиме имеется двухсекционный макет, но однослойный макет в портретном режиме. При вращении от пейзажа к портрету, если setRetainInstance() установлен в true, ни один фрагмент не уничтожается, но один фрагмент больше не имеет действительного вида, к которому он должен быть привязан, поэтому исключение.
Итак, если вы создаете приложение на основе фрагментов и вам нужно сохранить данные (например, ссылки на запуск AsyncTasks) между изменениями конфигурации, и вы не можете использовать Fragment.setRetainInstance(), и нет Fragment.onRetainNonConfigurationInstance(), что лучше всего подходит?