从BackStack保留ViewPager中的Fragment时重新加载WebView

Vis*_*jay 21 android android-webview android-fragments android-viewpager back-stack

这是一个Fragment包含a 的基本代码WebView.
WebFragment.java

public class WebFragment extends Fragment {
String TAG = "WebFragment";
private WebView webView;
private String currentUrl = "http://www.google.com";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.webview_layout, null);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    webView = (WebView) getView().findViewById(R.id.helloWebview);
    initWebView();
    webView.loadUrl(currentUrl);
}

@SuppressLint("SetJavaScriptEnabled")
private void initWebView() {
    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new JavaScriptInterface(), "HTMLOUT");
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.e(TAG, "Loding...");
            super.onPageStarted(view, url, favicon);
        }
    });
}

class JavaScriptInterface {
    public void showHTML(String html) {
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我还有2个基本片段(没有WebView).然后我把所有这些3 FragmentsViewPager(WebFragment,Fragment1Fragment2分别使用)FragmentAdapter.我加入android:configChanges="orientation|screenSize"AndroidManifest.xml(所以WebView不会在CONFIGRATION变化realod).
现在我的问题是,在运行应用程序时,我将第一页(WebFragmet)更改ViewPager为第二页(Fragment1),然后我又回到了第一页.所以没有问题WebFragment.

现在我再次改变了ViewPager这个WebFragment- > Fragment1- > Fragment2并通过颠倒上述动作的方向回到第1页.但在那个时候,我看到了WebViewWebFragment重新加载.

还有一个问题,无论何时WebView开始加载,我都可以看到2个日志条目.

WebFragment Loading...
WebFragment Loading...
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:
1)如何保留WebView重新加载? 2)为什么这里加载两次?WebFragmentBackStack
WebView

只是看到这个问题并帮助我(在FragmentPagerAdapter中阻止WebView重新加载?).

Chi*_*hah 29

在您已定义viewpager的主活动中

在宣告viewpager之后,就像这一行: ViewPager viewpager = (ViewPager) findViewById(R.id.pager);

添加此行:

viewpager.setOffscreenPageLimit(2);
Run Code Online (Sandbox Code Playgroud)

这将阻止您的片段重新创建到两个屏幕的滑动,因此当您从viewpager的第3页返回到第1页时,您的webview将不会重新加载.


Jay*_*yer 5

这是一个典型的案例,它成为通过覆盖android:configChanges来解决问题的简单补丁修复的受害者。不幸的是,配置更改的发生有多种原因。所以简单地捕捉屏幕尺寸的变化会错过很多......正如你所发现的。

首先,彻底删除android:configChanges. 然后将以下内容添加到您的WebView片段中。

protected void onSaveInstanceState(Bundle outState) {
  webView.saveState(outState);
}
Run Code Online (Sandbox Code Playgroud)

调整您的 WebView 片段的onActivityCreated方法以包括以下内容:

public void onActivityCreated(Bundle savedInstanceState) {
    webView = (WebView) getView().findViewById(R.id.helloWebview);
    initWebView();

    if (savedInstanceState != null)
        webView.restoreState(savedInstanceState);
    else
        webView.loadUrl(currentUrl);
Run Code Online (Sandbox Code Playgroud)

}

这应该让你朝着正确的方向前进。注意,调用 aWebView的 saveState() 不会保存显示数据。例如,输入标签不会保留用户输入。您需要手动解析网页以保留该数据。根据您使用 WebView 的目的,这将是一个主要的痛苦。