Java 片段无法在旋转时恢复正确的视图

Java 片段无法在旋转时恢复正确的视图,java,android,listview,android-fragments,android-asynctask,Java,Android,Listview,Android Fragments,Android Asynctask,我使用了一个带有两个主视图的片段,该视图具有setVisibility(),可根据用于在线搜索数据的异步任务的结果显示或隐藏 例如,以下是在视图之间切换的方法: private void switchView() { Log.d(LOG_TAG, "switchView(): show = " + show); mListView.setVisibility(show ? View.VISIBLE : View.GONE); searchView.setVisibilit

我使用了一个带有两个主视图的片段,该视图具有setVisibility(),可根据用于在线搜索数据的异步任务的结果显示或隐藏

例如,以下是在视图之间切换的方法:

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的result==true,它将隐藏searchView并显示mListView。但是,在旋转时,屏幕将返回到searchView,而不是继续显示mListView结果

日志输出显示了我对来自同一片段(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和位置==抽屉布局位置项):

从我的MainActivity.onCreate()中:


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

因此,这里发生的是:

  • 您的活动已创建,并向其中添加了一个片段
  • 您可以旋转设备
  • 您的活动将被重新创建(与先前添加的片段一起),在onCreate中,您将添加一个新片段,这意味着您在活动中添加了两个片段
处理此问题的最简单方法是在活动中执行检查:

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

另一种方法是通过在AndroidManifest.xml中指定配置更改来防止活动重新创建。作为恢复状态的一部分,会在循环时自动重新创建片段。因此,您应该只在
savedInstanceState==null
时调用
selectItem()
——否则您将获得已还原的片段(具有其还原状态),然后立即将其替换为全新的实例(不具有还原状态)。

您可以在将片段添加到活动的位置添加代码吗(我假设您是以编程方式添加它,而不是通过XML中的
)?是的,使用抽屉布局,方法selectItem(int position)使用我在问题中添加的代码切换内容框架中的片段。那么在活动的
onCreate()中会发生什么呢
显示片段?关于savedInstanceState,如果其不为空,则检索最后一个片段的保存位置并使用selectItem(int位置)方法来显示最后一个fragment.yep,看起来我在那里有不必要的代码来尝试在rotate上还原状态。删除第二个条件允许该片段检索其正确的savedState。感谢帮助!
if (savedInstanceState == null) {
        selectItem(0);
    } else if (placeID == null || placeID.isEmpty()) {
        selectItem(savedInstanceState.getInt(SELECTED_KEY));
    }   else    {
        selectItem(2);
    }
if (savedInstanceState == null){    // add fragment }