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

Другие вопросы по тегам