在android中,一个片段(比如说FragA)被添加到backstack而另一个片段(比如说FragB)会出现在顶部.现在回击FragA到顶部并被onCreateView()称为.现在我FragA处于一个特定的状态,然后FragB被推到它之上.
我的问题是如何恢复FragA到以前的状态?有没有办法保存状态(比如说在Bundle中),如果有,那么我应该覆盖哪种方法?
我已经看到了一些类似的问题,关于onSaveInstanceState没有被称为Fragments,但在我的情况下Fragment工作正常,这是主要FragmentActivity的麻烦.
相关代码看起来很简单:
public class MyFActivity extends FragmentActivity implements ActionBar.TabListener {
String[] allValues; // data to save
@Override
protected void onSaveInstanceState (Bundle outState) {
Log.d("putting it!", allValues.toString());
outState.putStringArray("allValues", allValues);
super.onSaveInstanceState(outState);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
allValues = savedInstanceState.getStringArray("allValues");
Log.d("getting it!", allValues.toString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
暂停活动时(使用后退按钮),onSaveInstanceState永远不会调用,因此,在恢复应用程序时savedInstanceState始终null在onCreate方法内.我尝试添加这样的块:
@Override
public void onPause() {
super.onPause();
onSaveInstanceState(new Bundle());
}
Run Code Online (Sandbox Code Playgroud)
这是在/sf/answers/993664171/中建议的,但是当 …
如何获取片段来保存它的状态?我已经尝试了一切,但没有运气,没有任何工作.
我试过添加:
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
myWebView.saveState(outState);
Log.w("///////", "onSaveInstanceState");
}
Run Code Online (Sandbox Code Playgroud)
但这永远不会被称为.
有任何想法吗?
我现在正在尝试恢复Web视图的状态:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mainView = (View) inflater.inflate(R.layout.frag_b, container, false);
myWebView = (WebView) mainView.findViewById(R.id.webviewtest);
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.google.com");
myWebView.setId(1);
myWebView.restoreState(savedInstanceState);
Log.w("///////", "onCreateView");
return mainView;
}
Run Code Online (Sandbox Code Playgroud)
但上述不起作用,任何想法?
我的Android应用程序有一个ActionBar变化,Fragment占用了一定的FrameLayout.当我onSaveInstanceState更改选项卡时,我试图用来保存片段的状态,以便可以恢复它onCreateView.
问题是,onSaveInstanceState永远不会被称为.在Fragment的onDestroyView和onCreateView方法的调用,但Bundle供给onCreateView仍然是零.
有人可以向我解释onSaveInstanceState实际调用的时间,如何确保在切换选项卡时调用它,或者在Fragment分离和重新连接时保存和恢复状态的最佳实践?
分段:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.event_log, container, false);
// Retrieve saved state
if (savedInstanceState != null){
System.out.println("log retrieved");
} else {
System.out.println("log null");
}
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
System.out.println("log saved");
super.onSaveInstanceState(outState);
// more code
}
Run Code Online (Sandbox Code Playgroud)
活动:
/** …Run Code Online (Sandbox Code Playgroud) 我正在使用支持库v4并且无法保存片段的状态.
@Override
protected void onSaveInstanceState(Bundle outState)
{
...
if(mFragment != null)
getSupportFragmentManager().putFragment(outState, "frag", mFragment);
...
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
...
if(savedInstanceState != null)
{
//Here I get NullPointerException
getSupportFragmentManager().getFragment(savedInstanceState, "frag");
}
...
}
Run Code Online (Sandbox Code Playgroud)
当我调用getFragment()时抛出NullPointerException(savedInstanceState包含带有"frag"的条目).
这是logcat输出的一部分:
04-18 00:10:56.719: E/AndroidRuntime(14644): Caused by: java.lang.NullPointerException
04-18 00:10:56.719: E/AndroidRuntime(14644): at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:569)
Run Code Online (Sandbox Code Playgroud)
我也试图调用getFragments()哪个返回null.这在我看来很奇怪.
我将不胜感激任何帮助!
解:
我忘了使用super.onSaveInstanceState(outState);里面的onCreate方法.
android savestate android-fragments android-fragmentactivity android-support-library