保存片段状态?

5

我有一个片段类。以下是它的代码:

public class FragmentA extends Fragment {

Button button;
WebView myWebView;
int mCurCheckPosition;

 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

 }

 @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("curChoice", mCurCheckPosition);
    }

 @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) {
            // Restore last state for checked position.
            mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
        }
}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved)
{
     View mainView = (View) inflater.inflate(R.layout.frag_a, group, false);
     myWebView = (WebView) mainView.findViewById(R.id.webview);
    myWebView.setWebViewClient(new MyWebViewClient());
    myWebView.getSettings().setPluginsEnabled(true);
    myWebView.getSettings().setBuiltInZoomControls(false); 
    myWebView.getSettings().setSupportZoom(false);
    myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);   
    myWebView.getSettings().setAllowFileAccess(true); 
    myWebView.getSettings().setDomStorageEnabled(true);
    myWebView.loadUrl("http://www.bbc.co.uk");       
    return mainView;
}


public class MyWebViewClient extends WebViewClient {        
    /* (non-Java doc)
     * @see android.webkit.WebViewClient#shouldOverrideUrlLoading(android.webkit.WebView, java.lang.String)
     */


    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.endsWith(".mp4")) 
        {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.parse(url), "video/*");

            view.getContext().startActivity(intent);
            return true;
        } 
        else {
            return super.shouldOverrideUrlLoading(view, url);
        }
    }

}

问题在于当我从一个片段移动到另一个片段时,原始片段的状态(所在的网页)会丢失。

我如何防止这种情况发生?我希望在每个片段之间切换时,网页的状态仍然保持。

谢谢。

2个回答

5
在onSaveInstanceState(Bundle outState)方法中,您应该使用WebView.saveState(Bundle state)方法来保存状态,然后在onActivityCreated(Bundle savedInstanceState)方法中使用WebView.restoreState(Bundle state)来恢复状态。
@Override
public void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   mWebView.saveState(outState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
   super.onActivityCreated(savedInstanceState);
   mWebView.restoreState(savedInstanceState);
}

此外,还要记住片段生命周期。如果不确定在哪里恢复状态(onCreate,onCreateView,onActivityCreated),请查看片段生命周期文档以找到正确的位置。 http://developer.android.com/guide/components/fragments.html

enter image description here

onCreate()

当系统创建片段时会调用此方法。在您的实现中,您应该初始化片段的必要组件,以便在暂停、停止和恢复后保留它们。

onCreateView()

当片段首次绘制其用户界面时,系统会调用此方法。为了为片段绘制UI,您必须从此方法返回一个视图,该视图是片段布局的根。如果片段不提供UI,则可以返回null。

onActivityCreated()

当Activity的onCreate()方法已经返回时,系统会调用此方法。在此期间,您可以执行与Activity相关的任何最终初始化。

当片段所属的活动已创建并实例化此片段的视图层次结构时调用。可以用于在这些部分就位后进行最终初始化,例如检索视图或恢复状态。对于使用setRetainInstance(boolean)保留其实例的片段也很有用,因为此回调告诉片段何时完全与新活动实例关联。在onCreateView(LayoutInflater,ViewGroup,Bundle)之后和onStart()之前调用。


我已经添加了代码,但它不起作用,我需要调用它们吗? - user1574268
@Akos,由于某些原因,在我切换片段时 onSaveInstanceState 没有被调用。当整个活动停止时,它会被调用。 - Vishesh Joshi
2
不能保证onSaveInstanceState()方法会被调用。 在此文档中查看详情:http://developer.android.com/reference/android/app/Activity.html“请注意,保存持久化数据应该在onPause()方法中进行,而不是在onSaveInstanceState(Bundle)方法中进行。因为后者不是生命周期回调的一部分,所以不会像文档中描述的那样在任何情况下都被调用。”也需要仔细阅读 http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle) - Akos Cz

0

我在一个片段中遇到了与webView内容相关的同样问题。对我有效的方法是在加载新片段时隐藏当前片段,而不是替换它。这样可以使视图保留在先前的片段中而不被销毁。请参考下面的代码。

protected void showTableFragment(Fragment fragment, boolean allowBack, Asset table) {

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    if (table != null)
        tableSection = (SectionTable) table;


        Fragment lastFragment = fragmentManager.findFragmentByTag("first_frag" );
        if ( lastFragment != null ) {
            transaction.hide( lastFragment );
        }


    if ( fragment.isAdded() ) {
        transaction.show( fragment );
    }
    else {
        transaction.add( R.id.fragment, fragment, "second_frag" ).setBreadCrumbShortTitle( "second_frag" );
    }

    if ( allowBack ) {
        transaction.addToBackStack( "second_frag" );
    }

    transaction.commit();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接