2014-11-14 67 views
0

我需要一些帮助来理解FragmentTransactions和FragmentManager的底层。林具有NPE抛出每当我重新创建活动,一个配置改变(屏幕旋转)之后,并调用FragmentManager getFragments返回null

List<Fragment> fragments = getSupportFragmentManager().getFragments(); 
    boolean pending = getSupportFragmentManager().executePendingTransactions(); 
    Log.d(LOG_TAG, "Any pending : " + Boolean.toString(pending)); 
    Log.d(LOG_TAG, "Size : " + Integer.toString(fragments.size())); 
    for(Fragment fragment : fragments){ 
     if(fragment != null & fragment.isVisible()){ 
      Log.d(LOG_TAG, "Fragment Tag : " + fragment.getTag()); 
     } 
    } 

示例输出看起来像这样

11-14 10:17:42.806: D/MainActivity(1825): Any pending : false 
11-14 10:17:42.806: D/MainActivity(1825): Size : 3 

堆栈跟踪在该行打印NPE下面是因为片段为空。

if(fragment != null & fragment.isVisible()){ 

这是我的困惑。在重新创建活动之前,我在经理中有两个片段。我附上了第三个片段,然后将其删除,留给我应该是两个片段。但是,经理说,列表中有三个片段。为什么是这样?我可以看到删除的片段通过其onDestroy()。管理器是否保留片段的空引用?

+0

你知道为什么会出现在列表中无效项?我的印象是调用FragmentTransaction.remove()会删除引用片段。 – Clocker 2014-11-14 15:26:28

+0

对不起,不知道:/ – WarrenFaith 2014-11-14 15:28:27

+0

够公平的。感谢您的回答! – Clocker 2014-11-14 15:31:35

回答

3

list.size()也计数null条目。

所以这

ArrayList<String> entries = new ArrayList<String>(); 
entries.add(null); 
Log.d("HomeFragment", "Entries " + entries.size()); 

打印此:

HomeFragment D Entries 1