«前の日記(2016年11月07日) 最新 次の日記(2016年12月06日)» 編集

日々をアレコレ

-広告-


2016年11月27日

Androidのレイアウトには気をつけろ

lipoyang師匠 から、Android版GP Propo をAndroid6.0位上の端末で動かすとデータの送信はできるけど受信がされないんだけどそっちの端末はどう?っていう連絡がきた。試してみると、Android4.4なXperiaZでは通信できてるっぽいのに、Android6.1なMoto G4plusでは送信はできるけどデータの受信ができてない。それについては、使ってるライブラリの問題かもというのが共通の認識で、最小限の機能を切り出して作り直したほうが速いかもってことで3日で作ってプルリクを投げた。

ただ、師匠の方では確認されてなかったけど、一部のViewが表示されなくなるという現象がMoto G4plusでだけ発生した。具体的には4列あるGridLayoutの2列目以降が表示されていない。いろいろと試しながら調べた結果、直接的な原因としては、独自で定義したViewのサイズが固定されていることだったみたい。元のソースの上では、以下のようなレイアウト定義になっていた。

  • GridLayoutはマージンとか除くと画面横向きにいっぱいの幅をもっている。
  • 4列すべてのウェイトが1に設定されている。
  • 2列目以降には独自で定義されたViewを持っていて、そのViewが持ってる子要素の幅は160dpとなっている。

これらを総合するとGridLayoutの表示にはマージンとかを考慮すると640dpともう少し必要となることになる。調べてみると、5.0インチフルHDでも5.5インチフルHDでもDP解像度は360x640が一般的なことが多く、5.0インチフルHDなXperiaZで発生していないのに、5.5インチフルHDなMoto G4plusで発生する原因としてはOSの違いだけになってくる。で、一つ思い浮かんだのは、画面下に表示される「バック/ホーム/マルチタスク」ボタンの存在。それらの扱いがOSのバージョンや端末の間で違うせいで、アプリ内で利用できるサイズに影響しているのかも、ということ。

で、解決するために以下のように修正。

  • 1列目は機能名の表示なので、ウェイトをなくして最小限のサイズに。ただし、2列目とのことを考えて少しマージンを追加。
  • 独自定義のViewに含まれる子要素の幅をすべて固定にはせずに、固定すべきものだけ設定して残りはlayout_weightを1にして、幅をmatch_parentに設定する。
  • GridLayoutの中の独自定義のViewについては、layout_gravityをfillに設定することで、独自定義のViewに近いサイズになるように。

もしかすると、画面サイズが極端に小さい端末があると、問題が発生するかもしれないけれど、元々BLEを対象としたアプリなので最近の端末しかインストールできないから多分問題ないはず。


-広告-

«前の日記(2016年11月07日) 最新 次の日記(2016年12月06日)» 編集