¿Por qué ocultar un Fragmento causa una exception de puntero nulo?

Actualización 1:

Vi esta respuesta que resolvió el problema, pero no entiendo por qué y me siento como este tipo .

Ambos devuelven un InfoboxFragments no nulo, pero la transacción falla con el primero .

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

¡¿Disculpe?!


Actualización 2:

childFragmentManager no funciona bien con fragments nesteds en xml.


He intentado ocultar un Fragmento dentro de otro Fragmento por un time. He intentado algunos enfoques y la networkingucción de la altura de los fragments secundarios a 1dp parece ser la más confiable, pero deja un fragment visible .

Entonces, probé un enfoque recomendado para usar childFragmentManager con transactions para ocultar el fragment como se muestra a continuación.

Los documentos de Android dicen esto sobre el método hide(fragment) :

Oculta un fragment existente. Esto solo es relevante para los fragments cuyas vistas se han agregado a un contenedor, ya que esto hará que la vista se oculte

Entonces, he contenido el fragment dentro de LinearLayout .

El showInfoBox() funciona bien pero el hideInfoBox() falla con un 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) 

La única diferencia parece ser las transactions hide y 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) } 

y

  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() } 

El fragment se agrega así:

 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()) }