eaglesakuraの技術ブログ

技術的な話題とか、メモとか。

ChildFragmentのViewが一部条件で表示されない場合のワークアラウンド

問題点

  • MotionLayoutの中にChildFragmentでConstraintLayoutの中にFragmentの中にカメラプレビューを置いた
    • ユーザーの操作にあわせてアニメーションしたり、Viewを入替えたりする
  • サムスンHuaweiの端末(もしくはAndroid 8以上?)でChildFragment.replace()すると、カメラが表示されない 場合がある

原因

  • onCreateView後、なぜかViewのmeasure, width, heightが全部0になっている
    • Viewがレイアウトされず放置されるらしい
    • Activity.onPause/onResumeを経由(Fragment開いているときに他のActivityからonActivityResultで結果を受け取ったり)すると100%再現
  • どこが原因か、正直不明だった

ワークアラウンド

  • 自動でViewの配置やViewレイアウトの構築をトリガーしてくれないなら、手動トリガーすればいいじゃない
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 親FragmentのViewを経由して再度レイアウトさせる. this.viewをやっても無駄
        requireParentFragment().requireView().requestLayout()
    }

どこが原因だ?

  • MotionLayoutか?
  • ChildFragment 2段階入れ子だからか?
  • ConstraintLayout in MotionLayoutだからか?
  • わからないが、コレで逃げられることはわかった