WebView предотвращает перезагрузку в фрагменте RetainInstance

У меня возникла проблема, препятствующая перезагрузке WebView, когда внутри фрагмента с сохранением isInstance установлено значение true.

Пути, которые я пробовал:

SaveInstanceState (не передает пакет при вращении из-за сохраненияInstance) Пользовательский пакет, который сохраняется на onSaveInstanceState и восстанавливается в create Сохранение ссылки WebView и попытка добавить ее обратно в иерархию представления

Должен быть более простой способ?

Ответ 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 - это приведет к непредвиденным сбоям при отображении раскрывающихся списков и потенциально других проблем.