为什么隐藏一个Fragment导致一个空指针异常?

更新1:

我看到这个答案解决了这个问题,但是我不明白为什么,并且觉得这个家伙 。

这两个都返回一个非null的InfoboxFragments,但事务失败,第一个

childFragmentManager.findFragmentById(R.id.infobox_fragment) childFragmentManager.findFragmentByTag("plz") 

打扰一下?!


更新2:

childFragmentManager不能和xml中的嵌套片段一起玩。


我一直在试图把片段隐藏在另一个片段里面。 我已经尝试了一些方法,并且将子碎片高度降低到1dp似乎是最可靠的, 但是会留下一些可见的碎片

所以,我尝试了使用childFragmentManager和事务的推荐方法来隐藏下面的片段。

Android文档中提到了hide(fragment)方法:

隐藏现有的片段。 这只对视图添加到容器的片段有用,因为这会导致视图被隐藏

所以,我在LinearLayout包含了这个片段。

showInfoBox()工作正常,但hideInfoBox()与NPE崩溃:

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.ViewGroup.startViewTransition(android.view.View)' on a null object reference at android.support.v4.app.FragmentManagerImpl.completeShowHideFragment(FragmentManager.java:1681) at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1778) 

唯一的区别似乎是hideshow交易。

  private fun showInfoBox() { val infoboxFragment = childFragmentManager.findFragmentById(R.id.infobox_fragment) as InfoboxFragment childFragmentManager.beginTransaction() .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out) .show(infoboxFragment) .commit() TransitionManager.beginDelayedTransition(constraintLayout) applyConstraintSet.applyTo(constraintLayout) } 

  private fun hideInfoBox() { // this crashes val infoboxFragment = childFragmentManager.findFragmentById(R.id.infobox_fragment) as InfoboxFragment childFragmentManager.beginTransaction() .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out) .hide(infoboxFragment) // with only this difference .commit() } 

这个片段是这样添加的:

 override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val infoboxFragment = InfoboxFragment() with(childFragmentManager) { beginTransaction().add(R.id.infobox_fragment_container, infoboxFragment).commit() //beginTransaction().hide(infoboxFragment).commit() } resetConstraintSet.clone(constraintLayout) applyConstraintSet.clone(constraintLayout) //applyConstraintSet.setVisibility(R.id.infobox_fragment_container, View.VISIBLE) applyConstraintSet.constrainHeight(R.id.infobox_fragment_container, 250.toDP()) }