Почему скрытие фрагмента вызывает исключение нулевого указателя?

Обновление 1:

Я видел этот ответ, который решил проблему, но я не понимаю, почему и чувствую себя таким парнем .

Оба они возвращают ненулевые 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()) }