2018年1月16日火曜日

Android7.0(Nougat)でgetLayoutParamsの反映タイミングでハマる

3年前ぐらいの自作アプリの整理をしていたら、Android7.1.1の端末で表示がおかしくなるアプリがあった。
その対処を備忘録として記載。


こう表示されてほしいのが…

こう表示されてしまう。

ゲーム開始直後に手前の自分のカードの大きさや位置が乱れている。
カードをドラッグすると意図した大きさに戻る。
android6.0以前の端末では発生していない。

この自分のカードはgetLayoutInflaterでレイアウトを重ねて(inflate)表示している。
onCreateとonWindowFocusChangedや処理の順番の関係なのか?getLayoutParamsの反映のタイミングが変わったのか?いろいろ調査していた。

対処方法としては、該当の自分のカードのviewにgetLayoutParamsで幅と高さを設定後に、requestLayoutを呼んで更新すると正常に表示された。
こんな感じ。

    hogeCard.getLayoutParams().width = width / 9;
    hogeCard.getLayoutParams().height = height / 9;
    //android7以降、初期表示がずれる対処
    hogeCard.requestLayout();

android6.0以前では問題なかったのだが。
inflateするviewについては幅と高さを設定後にrequestLayoutを呼ぶということで理解した。