Xperia Arcで画面レイアウトが崩れる時ー!崩れる時ー!(いつもここから風に)

Xperia Arc上でSmartTrainingを起動すると画面が崩れるという問い合わせがあったので対応してみました。
実機を持っていないので、強力な協力者(ええ、ダジャレですがなにか)にも支援いただきました。感謝。

■原因
AndroidManifest.xmlの記述がanyDensity=falseになっていた。

■対応
AndroidManifest.xmlの記述をanyDensity=trueに変更した。いじょ。

■副作用
MapView上のOverlayItemのサイズが解像度に依存してしまう。
→dimens.xmlでdp指定したサイズを読み込んで描画することで対応。

■経緯
詳しくは協力者のるるるさんのブログ参照。
Twitterで呼びかけたところ、るるるさんにご協力いただくことになりました。何度も何度もインストールとキャプチャ繰り返していただき本当にありがとうございました。

開発者視点で書くと、
・ヒアリングした状況
 ・画面レイアウトが崩れる。
 ・トップ画面だけ崩れる(他画面もほぼ同じ作りなのに)。
 ・一度崩れた画面でも画面遷移で戻ると直る。
・試したこと
 ・一部の文字のサイズ指定がdpになっていたので、sp指定に変更。
  →変化なし。
 ・SingleLine=trueのオプションを追加
  →ボタン文字列が2行に渡ることは無くなった。でも字がデカイまま。
 ・文字のサイズ指定そのものを小さくするように変更。
  →確かに小さくはなったが、許せん。
 ・「Xperia Arc 画面 崩れ」でググると、Spare PartsのCompatibility ModeをOFFにすると直るとの情報。
  →画面の表示のズレを解消するアプリ「Spare Parts」
  →現象が発生しなくなることを確認。ってことはアプリ側の設定が古いバージョン向けになってるのね。というところにたどり着きました。

元々、SmartTrainingのAndroidManifest.xmlはこうなっていました。
<uses-sdk android:minSdkVersion="3" />
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="false" />
古いアプリなので、今時、minSdkが3となっています。そして、できるだけ広い範囲のデバイスで動作して欲しいのでsupprots-screensも書いてあります。
anyDensityがfalseだとシステム側がいい塩梅で適当にやってくれるので楽~。だったのですが、Xperia Arcさんは「昔のことなんて覚えてねぇぜ(いや、時々忘れちゃうぜ、が正しいか)」とばかりにこの設定を無視してくれるので、画面が崩れます。
というわけで、こいつをtrueにして対応だん。

、、、としてリリースしたのですが、MapView上のOverlayItem(このアプリでいうと、ラリー画面の吹出しみたいなやつが該当します)が解像度に応じてサイズが大幅に変わる、という現象に気付いてしまいました。(ええ、テストしていませんがなにか)

原因は簡単で、OverlayItemの描画をコード上で生々しく数値で座標指定していたのに、anyDensity=trueになってしまったから。例えて言うなら、農業保護政策がいきなり撤廃されて、それまで国外からの安い農産物が大量に輸入されるのが防がれていたのが、なくなっちゃった状況です。しょうがないね、ということで、dimen.xmlにdp指定で座標を定義してそれを読み込むことで解決。
→答えはぜんぶここに書いてありました。「Y.A.M の 雑記帳 Android multi screen 対応」さすがです。

コメント

このブログの人気の投稿

Joinノードを使う(その1)

Execノードを使う

Joinノードを使う(その4)