我有一个片段类。以下是:
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);
}
}
}
}
问题是当我移动到另一个片段时,原始片段的状态(它所在的网页)会丢失。
我该怎样防止这种情况?我希望网页的状态保持与每个片段的切换。
由于
答案 0 :(得分:5)
您应该在的onSaveInstanceState(捆绑outState)方法使用WebView.saveState(Bundle state)方法,然后使用恢复状态WebView.restoreState(Bundle state)在onActivityCreated(捆绑savedInstanceState)方法
@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() 强>
当片段第一次绘制其用户界面时,系统会调用此方法。要为片段绘制UI,必须从此方法返回视图,该视图是片段布局的根。如果片段没有提供UI,则可以返回null。
<强> onActivityCreated() 强>
在创建片段的活动并且实例化此片段的视图层次结构时调用。一旦这些部分就位,它可用于进行最终初始化,例如检索视图或恢复状态。对于使用setRetainInstance(boolean)保留其实例的片段也很有用,因为此回调告诉片段何时与新活动实例完全关联。这是在onCreateView(LayoutInflater,ViewGroup,Bundle)之后和onStart()之前调用的。
答案 1 :(得分: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();
}