2014-10-16 68 views
0

我正在使用两个主要视图的片段,该视图基于用于在线搜索数据的AsyncTask的结果显示或隐藏了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得到结果== true,它将隐藏searchView并显示mListView。但是在旋转时,屏幕将返回到searchView,而不是继续显示mListView结果。

我对日志输出困惑,显示什么,我相信从同一个片段两次调用onCreateView(DiscoverFragment),在这里看到:

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和位置== 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)为空/空,则恢复之前的状态。否则,转到将显示通知数据的碎片。

+0

您可以添加代码,将片段添加到活动中(我假设您以编程方式添加它,而不是通过XML中的“”)? – ianhanniballake 2014-10-16 21:38:39

+0

是的,使用DrawerLayout,方法selectItem(int position)使用在问题中添加的代码在content_frame中切换片段。 – fakataha 2014-10-16 21:43:05

+0

那么在你的activity的'onCreate()'中显示一个片段会发生什么? – ianhanniballake 2014-10-16 21:45:22

回答

1

片段指定配置的变化上旋转而自动重新创建为恢复状态的一部分,以防止活动娱乐。因此,只有在savedInstanceState == null时才应拨打selectItem() - 否则您将恢复您的恢复片段(恢复其状态),然后立即将其替换为全新的实例(未恢复状态)。

+0

是的,看起来像我有不必要的代码在那里尝试和恢复旋转状态。删除第二个条件允许该片段检索其正确的savedState。谢谢您的帮助! – fakataha 2014-10-16 21:59:03

0

所以,这里所发生的是:

  • 你的活动创建,一个片段添加到它
  • 您先前旋转你的设备
  • 您的活动得到重建(与该片一起添加),并在onCreate,你添加一个新的片段,这意味着你有两个片段添加到您的活动

最简单的方法来处理这是执行检查您的活动Y:

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

另一方法是通过在加入AndroidManifest.xml