片段无法恢复正确旋转视图

时间:2014-10-16 21:31:45

标签: java android listview android-fragments android-asynctask

我正在使用具有两个主视图的片段,这些视图具有setVisibility()以根据用于在线搜索数据的AsyncTask的结果显示或隐藏。

例如,以下是在Views:

之间切换的方法
private void switchView()
{
    Log.d(LOG_TAG, "switchView(): show = " + show);
    mListView.setVisibility(show ? View.VISIBLE : View.GONE);
    searchView.setVisibility(show ? View.GONE : View.VISIBLE);
    mCompanyArrayAdapter.notifyDataSetChanged();
}

我采用这种方法,以便在AsyncTask完成时,它可以将数据解析为包装类,并创建这些对象的ArrayList,以便在ListView适配器中使用。 (如果有另一种方法将自定义类传递给另一个片段,我会愿意使用它。)

一旦从Async得到结果== true,它会隐藏searchView并显示mListView。但是在旋转时,屏幕会返回到searchView,而不是继续显示mListView结果。

我对Log输出感到困惑,它显示了我相信从同一个片段(DiscoverFragment)对onCreateView的两次调用,如下所示:

10-17 10:29:21.872    6603-6603/nz.co.exium.panther D/DiscoverFragment﹕ onCreateView: savedinstancestate is null = false
10-17 10:29:21.877    6603-6603/nz.co.exium.panther D/AbsListView﹕ Get MotionRecognitionManager
10-17 10:29:21.882    6603-6603/nz.co.exium.panther D/DiscoverFragment﹕ onCreateView: savedinstancestate is null = true

因此,第一个显示找到savedInstanceState!= null并适当地设置布尔值,然后调用另一个onCreateView(),其中savedInstanceState为null并将其设置为false。为什么旋转后加上onCreateView()?

感谢您的帮助。

根据要求,代替MainActivity中的片段(使用FrameLayout作为content_frame和position == DrawerLayout位置项)。:

getFragmentManager().beginTransaction()
                    .replace(R.id.content_frame, Fragment.instantiate(
                            getApplicationContext(), mClasses[position]))
                    .commit();

来自我的MainActivity.onCreate():

if (savedInstanceState == null) {
        selectItem(0);
    } else if (placeID == null || placeID.isEmpty()) {
        selectItem(savedInstanceState.getInt(SELECTED_KEY));
    }   else    {
        selectItem(2);
    }

如果null设置了默认的Fragment,我已经检查了之前的savedInstanceState。如果变量placeID(来自BroadcastReceiver)为null / empty,则恢复先前的状态。否则,请转到将显示通知数据的片段。

2 个答案:

答案 0 :(得分:1)

作为恢复状态的一部分,片段会在轮换时自动重新创建。因此,您只应在selectItem()时调用savedInstanceState == null - 否则您将获得已恢复的片段(已恢复状态),然后立即将其替换为全新实例(未恢复状态)。

答案 1 :(得分:0)

所以,这里发生的是:

  • 您的活动已创建,并且已添加一个片段
  • 您可以旋转设备
  • 您的活动将被重新创建(以及之前添加的片段),并且在onCreate中,您添加了一个新片段,这意味着您在活动中添加了两个片段

处理此问题的最简单方法是检查您的活动:

if (savedInstanceState == null){    // add fragment }

另一种方法是通过在AndroidManifest.xml中指定配置更改来阻止活动重新创建