Я видел этот ответ, который решил проблему, но я не понимаю, почему и чувствую себя таким парнем .
Оба они возвращают ненулевые InfoboxFragments, но транзакция терпит неудачу с первой .
childFragmentManager.findFragmentById(R.id.infobox_fragment) childFragmentManager.findFragmentByTag("plz")
Извините?!
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()) }