FrameLayoutでsetMarginを使う

iPhoneのアプリをAndroidに移植する作業をしています。

iPhoneのUIは基本的に位置をドット単位(厳密には違うが)で指定するため、AbsoluteLayout亡き今、Androidではなかなか任意の位置にViewを配置するのは難しい。

とりあえずよくある手法は、LayoutParamsでサイズと位置を設定するもの。こんな感じ。

public void setViewFrame(View view, Rect rect) {
Rect newRect = convertVirtualRectToRealRect(rect); //iOSでの座標指定からAndroidの現解像度にあうよう座標変換する
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(newRect.width(), newRect.height());
params.setMargins(newRect.left, newRect.top, 0, 0);
view.setLayoutParams(params);
}

しかし、何故かこれではうまくいかない。

色々試行錯誤した結果、以下のように、

public void setViewFrame(View view, Rect rect) {
Rect newRect = convertVirtualRectToRealRect(rect);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(newRect.width(), newRect.height());
params.gravity = Gravity.NO_GRAVITY; // <--必須!
params.setMargins(newRect.left, newRect.top, 0, 0);
view.setLayoutParams(params);
}

LayoutParamsのインスタンスのgravityプロパティにGravity.NO_GRAVITYを設定する事で解決。

なお、これは2.xくらいでの話で、4.0ではこの処置をしなくても問題無かった。でもやっておいたほうが良かろう。

こちらの記事もどうぞ

  • ぬいぐるみの洗い方ぬいぐるみの洗い方 重曹の粉をまんべんなくぬいぐるみにまぶす。 ビニール袋に包んで一晩置く。 […]
  • SHL21感想SHL21感想 これまでISW13Fを使っていたわけですが、クアッドコアを謳うわりには動作が […]
  • HMZ-T3HMZ-T3 最近とても仕事が忙しくて、日記書くどころかアニメすら見る暇がないという、アニ […]
  • VAIO Pro 13VAIO Pro 13 壊れたVAIO […]
  • au AQUOS PHONE SHL23au AQUOS PHONE SHL23 SHL24が出たというのに、今さらSHL23です。 SHL21からの機種変な […]
  • オタクが婚活を始めてみた話(4)オタクが婚活を始めてみた話(4) Yahoo!お見合いの話までやっときたぜ! まずなんでYahoo!お見 […]