我正在使用具有两个主视图的片段,这些视图具有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,则恢复先前的状态。否则,请转到将显示通知数据的片段。
答案 0 :(得分:1)
作为恢复状态的一部分,片段会在轮换时自动重新创建。因此,您只应在selectItem()
时调用savedInstanceState == null
- 否则您将获得已恢复的片段(已恢复状态),然后立即将其替换为全新实例(未恢复状态)。
答案 1 :(得分:0)
所以,这里发生的是:
处理此问题的最简单方法是检查您的活动:
if (savedInstanceState == null){ // add fragment }
另一种方法是通过在AndroidManifest.xml中指定配置更改来阻止活动重新创建