为什么隐藏一个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)
唯一的区别似乎是hide
和show
交易。
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()) }