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

Posted

技术标签:

【中文标题】Android - 恢复 Fragment WebView 状态以避免重新加载【英文标题】:Android - Restore Fragment WebView state to avoid reload 【发布时间】:2019-01-21 06:30:28 【问题描述】:

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

我错过了什么?

【问题讨论】:

【参考方案1】:

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

查看this solution、fragment life cycle communications 和life cycle 文档。

编辑

    首先尝试将您的片段添加到后台堆栈。 您的onPause() 方法目前可能没用,除非您在片段中更改活动。 不要尝试在onCreateView 方法中恢复,而是尝试从onActivityCreated() 方法中的实例变量中恢复您的状态。

Edit-2

显然这个答案的第一部分不是 %100 正确的。在某些情况下,片段事务发生时,可以调用onPause()等方法。

【讨论】:

感谢您的回复,调试时我可以看到 onPause 方法被调用并分配了 webViewBundle,但是当我在 onCreateView 上检查 webViewBundle 时,它​​再次为空。 @ShlomiSchwartz 然后,可能该片段被破坏了。尝试将片段添加到 backstack 怎么样? 找到了...我的问题是每次导航时我都在创建一个新片段【参考方案2】:

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

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于Android - 恢复 Fragment WebView 状态以避免重新加载的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Fragment 是不是从后台恢复?

Android中FragmentPagerAdapter对Fragment的缓存

Android Fragment使用 嵌套Fragments (Nested Fragments) 的使用及常见错误

Android Fragment使用 嵌套Fragments (Nested Fragments) 的使用及常见错误

Android - 使用 FragmentStatePagerAdapter 保存/恢复状态

Fragment