Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在onSaveInstanceState中使用foreach会引发nullpointerexception_Android_Foreach_Constants_Fragment - Fatal编程技术网

Android 在onSaveInstanceState中使用foreach会引发nullpointerexception

Android 在onSaveInstanceState中使用foreach会引发nullpointerexception,android,foreach,constants,fragment,Android,Foreach,Constants,Fragment,我正在尝试保存活动中当前可见的所有片段的标记 所以我定义了这些: // 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 o

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

所以我定义了这些:

// 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\u COLLECTIONS\u TAG”、“EDIT\u IMAGE\u TAG”、“ADD\u IMAGE\u TAG”}
,但这并没有改变结果


这是怎么回事?

根据Marko Lazic的输入,我发现了两个错误:

  • 并不是所有添加的片段都有标记,这导致了空值。这已得到纠正
  • 无法使用所有片段标记的静态列表,因为很明显,一些片段标记尚未添加,并且正如Marko所指出的,无法找到尚未添加的片段,因此这也抛出了null
  • 解决方案:

  • 我需要找到一种方法为添加的片段创建标记的动态列表。这是通过以下方式实现的:

    @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);
      }
    }
    

  • 感谢您的帮助,各位。

    也许您可以使用调试器一步一步地检查代码,并在运行时发现变量的值。您可能必须首先定义它们。如果找不到片段,会发生什么?它将为null,并且不能对null对象调用.isVisible()。因为每一个都是肯定有效的,所以不要为此烦恼。马尔科是这么说的。看到你硬编码索引的地方了吗?尝试对每个索引进行硬编码,找出哪个标记导致无法解析的片段。foreach工作。