替换包含webview的片段时保存WebView的状态

时间:2016-07-28 18:32:46

标签: android webview fragment savestate

我使用webview创建基本的Web浏览器, 目前我有一个活动和多个片段:

- 浏览器 - 别的 - 别的什么

浏览器片段中的

我有webview:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".fragments.BrowserFragment">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipe_refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:id="@+id/webview_holder"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="true">
            <include
                android:id="@+id/button_layout"
                layout="@layout/bottom_btn_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"/>

            <LinearLayout
                android:id="@+id/web_page_container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_above="@id/button_layout"
                android:orientation="vertical">

            </LinearLayout>

            <WebView
                android:id="@+id/web_page"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_above="@id/button_layout"/>


        </RelativeLayout>

    </android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

我可以使用

在屏幕旋转中保存webview的状态
@Override
public void onSaveInstanceState(Bundle outState) {
    if(mWebView != null){
        mWebView.saveState(outState);
    }
    super.onSaveInstanceState(outState);

}

并调用此OnActivityCreated:

 mWebView = (WebView)getActivity().findViewById(R.id.web_page);

        if (savedInstanceState != null){
            mWebView.restoreState(savedInstanceState);
        }else{
            mWebView.loadUrl(makeUrl(url));
        }

当屏幕旋转并重新创建活动时,此功能正常。 但是当我使用导航抽屉并在同一容器中替换片段然后尝试回到相同的片段。 webview的状态丢失了。

我得到的结论是,当存在Fragment事务时,不会调用onSaveInstanceState()。所以我尝试通过从片段的OnPause调用onSaveInstanceState()来保存webView状态。但在这种情况下,我在OnCreateView中将savedInstanceState视为null,因此我无法恢复状态。

我需要维护多个webview的状态,并在点击列表时回复它们。

我还尝试保存webview,当在片段中调用onSave()时,在活动中的静态HashMap中尝试将其分配给newFragment的webview。但在这种情况下我得到了空白屏幕。

有人可以指点我如何处理这个问题。

0 个答案:

没有答案