Android 片段不保存状态,在旋转/屏幕锁定/返回时崩溃

Posted

技术标签:

【中文标题】Android 片段不保存状态,在旋转/屏幕锁定/返回时崩溃【英文标题】:Android fragments not saving states, crashing on rotation/screen lock/back 【发布时间】:2012-03-20 02:11:17 【问题描述】:

每当我锁定屏幕、返回、旋转屏幕或点击主屏幕时,我的应用程序都会崩溃。这个应用程序实现了一个带有 3 个选项卡的片段 UI。在我的清单中,我有 android:configChanges="orientation",并且这是有效的,直到我改变了一些东西(我不记得它是什么)。现在即使在我的清单中,我的应用程序也无法处理旋转更改。我正在尝试实现 onSaveInstanceState、onRestoreInstanceState、onPause 和 onResume,但它继续崩溃。以下是部分代码:

protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    // Inflate the layout
    setContentView(R.layout.main);

    // Initialize the TabHost
    this.initializeTabHost(savedInstanceState);
    if (savedInstanceState != null) 
         // set the tab as per the saved state
        mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
    
    // Initialize ViewPager
    this.initializeViewPager();

   

@Override
protected void onPause() 
    super.onPause();       
    

 @Override
protected void onResume() 
super.onResume();         


@Override
protected void onSaveInstanceState(Bundle outState) 
    super.onSaveInstanceState(outState);
    outState.putString("tab",
            mTabHost.getCurrentTabTag()); // save the tab selected



@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) 
    super.onRestoreInstanceState(savedInstanceState);
    String myString = savedInstanceState.getString("tab");


用于应用程序启动和崩溃的 LOGCAT

【问题讨论】:

您收到什么错误信息?请使用 aLogCat 等日志检查应用程序进行检查。 这里是 logcat pastebin.com/dU4663Ey 【参考方案1】:
super.onSaveInstanceState(outState);
outState.putString("tab",
        mTabHost.getCurrentTabTag()); // save the tab selected

应该是

outState.putString("tab",
        mTabHost.getCurrentTabTag()); // save the tab selected

super.onSaveInstanceState(outState);

您需要在调用 onSaveInstanceState 之前将“tab”添加到 outState 以避免在 OnCreate 中加载时出现异常。换句话说,您的“标签”实际上从未被保存,因为您在将“标签”添加到状态之前保存状态。

【讨论】:

即使我改变它,我仍然得到同样的异常。我的代码实际上是以前的,我不确定为什么要更改它。可能只是为了实验。但是,我仍然遇到同样的问题 // Field descriptor #12 I public static final int POP_BACK_STACK_INCLUSIVE = 1; 我不知道如何,我的意思是我可以找到错误,但是当应用程序崩溃时,在 Eclipse 中它会打开“FragmentManager.class”,然后说“找不到源”。这有帮助吗?:pastebin.com/MtrFFNBc 我该怎么做?我为片段遵循的教程从未提到过。

以上是关于Android 片段不保存状态,在旋转/屏幕锁定/返回时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在recyclerview片段Reandroid中屏幕旋转后进度条不显示

保存/恢复片段状态android

保存/恢复片段状态android

屏幕旋转后Android片段重叠

在 xamarin.android 中管理屏幕旋转时的片段外观

Android - 片段屏幕旋转[重复]