У меня есть ContainerView внутри фрагмента, который должен быть изменен в соответствии с размером экрана. По этой причине я view.post{}
в onViewCreated.
При первом переходе к фрагменту все в порядке, и представление изменяется в соответствии с назначением. Однако когда я затем перехожу к другому фрагменту и после этого снова перехожу к первому фрагменту, он больше не изменяется.
Я уже пытался просмотреть.invalidate () внутри view.post {}и попытался использовать ViewTreeObserver, оба дали одинаковые результаты.
Это мой код:
class Fragment : OtherFragment() {
override fun onStart() {
super.onStart()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.post {
val containerView = view.findViewById<ConstraintLayout>(R.id.container)
Timber.d("${containerView.id}")
val originalWidth = containerView.width
containerView.layoutParams.width = Resources.getSystem().displayMetrics.widthPixels
containerView.layoutParams.height = ((containerView.width / originalWidth).toFloat() * containerView.height).toInt()
Timber.d("originalWidth: $originalWidth, displayWidth: ${Resources.getSystem().displayMetrics.widthPixels}")
Timber.d("onViewCreated: posted to view")
}
Timber.d("onViewCreatedCalled!")
}
override fun onDetach() {
super.onDetach()
}
}
Журналы показывают, что onViewCreated и view.post {} вызваны. Кроме того, originalWidth (1148), displayWidth (1080) и containerView.id имеют одинаковые значения при каждой итерации.
Что мешает представлению обновлять свой размер при отображении во второй раз?
Это код, который обрабатывает навигацию из MainActivity:
private fun changeFragment(fragment: Fragment) {
val fragmentTransaction = fragmentManager?.beginTransaction()
fragmentTransaction?.replace(R.id.placeholder, fragment)
fragmentTransaction?.addToBackStack(null)
fragmentTransaction?.commit()
}
override fun onBackPressed() {
handleBackPressed()
}
private fun handleBackPressed() {
if (supportFragmentManager.backStackEntryCount != 0 || doubleBackToExitPressedOnce) {
super.onBackPressed()
} else {
this.doubleBackToExitPressedOnce = true
Handler().postDelayed({ doubleBackToExitPressedOnce = false }, 2000)
Toast.makeText(this, getString(R.string.toast_exit), Toast.LENGTH_SHORT).show()
}
}