ラベル

技術 (81) 開発 (78) ゲーム (67) アプリ (63) 福岡 (59) 趣味 (59) android (53) アニメ (22) レトロゲーム (21) 温故知新 (21) ガンダム (19) レポート (19) WEBサイト (17) 経済 (17) iOS (9) 麻雀 (7) グルメ (5) マンガ (4) Wear (1)

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を呼ぶということで理解した。