Ответ 1
Вы можете сделать это довольно легко. Поскольку вы уже сохраняете экземпляр, держите ссылку на WebView
во Фрагменте и отсоединяйте его от родителя при вызове Fragment onDestroyView(). Если он не равен null, просто верните его в 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);
}
}
}
Однако вы будете утечка одной ссылки на первую активность при первом изменении ориентации - что-то я еще не понял, как этого избежать. Нет никакого способа установить контекст в представлении, насколько мне известно. Это действительно работает, если вы в порядке с этой утечкой памяти.
EDIT: Альтернативно, если вы создаете его программным способом, как я делаю в этом примере, вы можете просто использовать getActivity().getApplicationContext()
, чтобы избежать утечки активности. Если вы используете предоставленный LayoutInflater, это придаст контексту приложения представлениям при раздувании.С >
Не используйте контекст приложения для WebView - это приведет к непредвиденным сбоям при отображении раскрывающихся списков и потенциально других проблем.