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 文档。
编辑
- 首先尝试将您的片段添加到后台堆栈。
- 您的
onPause()
方法目前可能没用,除非您在片段中更改 activity。
- 与其尝试在
onCreateView
方法中恢复,不如尝试从 onActivityCreated()
方法中的实例变量恢复状态。
Edit-2
显然这个答案的第一部分不是 %100 正确的。可能会出现片段事务发生的情况,像onPause()
这样的方法可以被调用。
唯一的恢复方法是创建视图模型。这也不会停止重新加载。只会恢复 WebView 状态。
我有一个底部导航栏应用(使用 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 文档。
编辑
- 首先尝试将您的片段添加到后台堆栈。
- 您的
onPause()
方法目前可能没用,除非您在片段中更改 activity。 - 与其尝试在
onCreateView
方法中恢复,不如尝试从onActivityCreated()
方法中的实例变量恢复状态。
Edit-2
显然这个答案的第一部分不是 %100 正确的。可能会出现片段事务发生的情况,像onPause()
这样的方法可以被调用。
唯一的恢复方法是创建视图模型。这也不会停止重新加载。只会恢复 WebView 状态。