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);
        }
    }

}

}

问题是当我移入和移出另一个片段时,原始片段的状态(它所在的网页)丢失了。

我怎样才能防止这种情况?我希望网页的状态保持在每个片段之间来回切换。

谢谢

4

2 回答 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),请查看 Fragment Lifecycle 文档以找出正确的位置。 http://developer.android.com/guide/components/fragments.html

在此处输入图像描述

onCreate()

系统在创建片段时调用它。在您的实现中,您应该初始化在片段暂停或停止然后恢复时要保留的片段的基本组件。

onCreateView()

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

onActivityCreated()

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

于 2012-08-03T17:43:47.513 回答
0

我对片段中的 webView 内容有同样的问题。对我有用的是在加载新片段而不是替换它时隐藏当前片段。这会导致视图保留在前一个片段中而不会被破坏。查看下面的代码。

受保护的无效showTableFragment(片段片段,布尔allowBack,资产表){

    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();
}
于 2013-10-09T11:57:59.537 回答