Android - 恢复片段 WebView 状态以避免重新加载

Android - Restore Fragment WebView state to avoid reload

我有一个底部导航栏应用(使用 Android Studio 模板创建)。该应用程序在两个片段之间导航。在其中一个片段上,我有一个 WebView,我想避免每次导航到片段视图时都重新加载它。

阅读 this article 后,我试过像这样保存 webview 状态:

package com.example.bla.myapp.fragments;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.example.shlomishwartz.adintegration.R;

public class VideoFragment extends Fragment {
    private String PAGE_URL = "https://my.html.view.html";
    private Bundle webViewBundle;
    private WebView webView;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View videoFragment = inflater.inflate(R.layout.video_fragment, null);

        webView = (WebView) videoFragment.findViewById(R.id.video_webview);
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        WebView.setWebContentsDebuggingEnabled(true);
        webView.setWebViewClient(new WebViewClient());

        // HERE IS WHERE I TRY TO RESTORE THE STATE

        if (webViewBundle == null) {
            webView.loadUrl(PAGE_URL);
        } else {
            webView.restoreState(webViewBundle);
        }
        return videoFragment;
    }

    @Override
    public void onPause() {

        // HERE IS WHERE I SAVE THE STATE

        super.onPause();
        webViewBundle = new Bundle();
        webView.saveState(webViewBundle);
    }

}

但是,每次我导航到片段 webViewBundle 都是 null 并且 HTML 被重新加载。

我错过了什么?

因为Fragment的生命周期与其Activity的生命周期密切相关。 Fragment 方法如 onPause()onResume() 只有在 Activity 的生命周期切换到该状态时才会被调用。

查看 this solution, fragment life cycle communications and life cycle 文档。

编辑

  1. 首先尝试将您的片段添加到后台堆栈。
  2. 您的 onPause() 方法目前可能没用,除非您在片段中更改 activity。
  3. 与其尝试在 onCreateView 方法中恢复,不如尝试从 onActivityCreated() 方法中的实例变量恢复状态。

Edit-2

显然这个答案的第一部分不是 %100 正确的。可能会出现片段事务发生的情况,像onPause()这样的方法可以被调用。

唯一的恢复方法是创建视图模型。这也不会停止重新加载。只会恢复 WebView 状态。