Android-还原Fragment WebView状态以避免重新加载

时间:2018-08-14 11:51:00

标签: android html android-fragments android-webview state

我有一个底部导航栏应用程序(使用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 为空并重新加载HTML。

我想念什么?

1 个答案:

答案 0 :(得分:0)

因为Fragment的生命周期与其Activity的生命周期严格相关。仅在Fragment的生命周期已切换到该状态时,才能调用onPause()onResume()之类的Activity方法。

请查看this solutionfragment life cycle communicationslife cycle文档。

修改

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

编辑2

显然,此答案的第一部分不正确%100。在某些情况下,发生碎片事务时,可以调用诸如onPause()之类的方法。