«Как исправить: представление во фрагменте обновляется только при первом отображении фрагмента» - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть 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()
    }
}
...