はじめに
各デバイスサイズ毎に表示されているViewの大きさを取得して比較したかった際にかなり躓きました。
やりたかったこととしてはデバイス毎にScrollViewの全体のサイズと表示されている領域の高さの差分を取得してスクロールできる領域があるかどうかを確認するといった内容です(もっとスマートなやり方があれば知りたい......)
ViewのIDを何度も確認したりDataBinding部分やgetHeightの中身を読んでも解決せず......
何度かデバッグモードで動かしているうちに見当がついて調べたところ解決しました。
課題
自身の環境ではレイアウトはxmlでConstraintLayoutを使用して記述しており、DataBindingでFragmentから参照しています。
そこでViewのサイズを下記コードで取得しようとしたところ0で返ってきてしまいました。
binding.viewId.height
不思議に思い一度デバッグで確認していたところViewが生成されるより前に取得を試みているようです。
解決方法
viewTreeObserverの中であれば取得可能です。
binding.viewId.viewTreeObserver.addOnGlobalLayoutListener {
binding.viewId.heightbinding.viewId.height
}
自分はScrollViewの高さを知りたかったのでaddOnScrollChangedListenerで取得しましたがviewTreeObserverの中であれば良いようです。
viewが生成されて高さや幅を持つタイミングがviewTreeObserverのようです。
ミスによりadapterやlifeCycleOwnewなど生成される前に参照してエラーが起こることはありますが今回はエラーでもNullでもなく値が0で返ってくる分少し悩みました......