0

我正在尝试为当前可见的活动中的所有片段保存标签。

所以我定义了这些:

// Fragment TAGS
private final static String EDIT_COLLECTIONS_TAG = "edit collection";
public final static String EDIT_IMAGE_TAG = "edit image";
public final static String ADD_IMAGE_TAG = "add image";

// Collection of Frag Tags
private final static String[] FRAG_TAGS = {EDIT_COLLECTIONS_TAG, EDIT_IMAGE_TAG, ADD_IMAGE_TAG};

onSaveInstanceState(Bundle outState)做到了:

    for(String tag : FRAG_TAGS){
        if(getFragmentManager().findFragmentByTag(tag).isVisible()){
            outState.putString(tag, tag);
        }           
    }

...但是 LogCat 告诉我该if行正在引发空指针异常。

所以不知道我为什么尝试:

    if(getFragmentManager().findFragmentByTag(FRAG_TAGS[1]).isVisible()){
        outState.putString(EDIT_IMAGE_TAG, EDIT_IMAGE_TAG);
    }

......这奏效了。

所以看起来访问数组没有问题。在云雀中,我将数组的内容更改为实际的字符串:{"EDIT_COLLECTIONS_TAG", "EDIT_IMAGE_TAG", "ADD_IMAGE_TAG"}但这并没有改变结果。

那么这里发生了什么?

4

1 回答 1

0

鉴于 Marko Lazic 的输入,我发现了两个错误:

  1. 并非所有添加的片段都被赋予标签,这导致空值。这已得到纠正。
  2. 不能使用所有片段标签的静态列表,因为很明显,有些还没有被添加,正如 Marko 指出的那样,找不到不存在的片段,所以这也抛出了 null。

解决方案:

  1. 我需要找到一种方法来为添加的片段创建动态标签列表。这是通过以下方式完成的:

    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
    @Override
    public void onAttachFragment(Fragment fragment) {
      super.onAttachFragment(fragment);
    
      // add attached fragment's tag to set of tags for attached fragments
      AddedFragmentTagsSet.add(fragment.getTag());
    
      // if when adding the fragment another fragment has become detached, remove its tag from the set
      for(String tag : AddedFragmentTagsSet){
        if(getFragmentManager().findFragmentByTag(tag).isDetached()){ // or isVisible() probably
            AddedFragmentTagsSet.remove(tag);
        }
        Log.d(TAG, SCOPE +"contents of AddedFragmentTagsSet: " +tag);
      }
    }
    

谢谢你们的帮助,伙计们。

于 2013-05-24T23:44:54.280 回答