WebView предотвратить перезагрузку во фрагменте RetainInstance
У меня проблема с предотвращением перезагрузки WebView, когда внутри фрагмента с retainInstance установлено значение true.
Маршруты, которые я пробовал:
SaveInstanceState (не передает пакет при ротации из-за retainInstance) Пользовательский пакет, который сохраняется в onSaveInstanceState и восстанавливается при создании Сохранение ссылки на WebView и попытка добавить ее обратно в иерархию представления.
Должен быть более простой способ?
1 ответ
Вы можете сделать это довольно легко. Поскольку вы уже сохраняете экземпляр, сохраните ссылку на WebView
во фрагменте и отсоедините его от родителя, когда вызывается onDestroyView() фрагмента. Если он не нулевой, просто верните его в onCreateView(). Например:
public class RetainedWebviewFragment extends Fragment {
private WebView mWebView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (mWebView == null) {
mWebView = new WebView(getActivity());
}
return mWebView;
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (getRetainInstance() && mWebView.getParent() instanceof ViewGroup) {
((ViewGroup) mWebView.getParent()).removeView(mWebView);
}
}
}
Тем не менее, вы потеряете одну ссылку на первое действие при первом изменении ориентации - то, что я еще не понял, как избежать. Насколько мне известно, нет способа установить контекст в View. Это работает, хотя, если вы в порядке с этой одной утечкой памяти.
РЕДАКТИРОВАТЬ: В качестве альтернативы, если вы создаете его программно, как я делаю в этом примере, вы можете просто использовать getActivity().getApplicationContext()
чтобы избежать утечки активности. Если вы используете предоставленный LayoutInflater, он придаст контекст приложения представлениям.
Не используйте контекст приложения для WebView - это приведет к неожиданным сбоям при отображении выпадающих представлений и, возможно, к другим проблемам.