備忘録 〜プログラミング〜

プログラミングに関する事をつらつらと、、

コード上で高さを数値で設定するときに、デバイス毎に高さが変わってしまう問題

コード上で動的に高さを変更する必要が出てきたのですが、以下のように設定しても、デバイス毎に高さが変わってしまいます。

final ScrollView scrollView = (ScrollView) view.findViewById(R.id.scroll_view);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(0, 60, 0, 0);
scrollView.setLayoutParams(lp);

そもそもこのsetMarginsで設定している、60のサイズはpxなのか、dpなのかどちらなのかを調べたところ、コード上で設定する値は、pxだという事が分かりました。stackoverflow.com
なので、このpxをdpに変換するメソッドを作成

//pxをdpに置換
private static int convertPxToDp(Context context, int px){
  float d = context.getResources().getDisplayMetrics().density;
  return (int)((px / d) + 0.5);
}

//dpをpxに置換
public static int convertDpToPx(Context context, int dp){
  float d = context.getResources().getDisplayMetrics().density;
  return (int)((dp * d) + 0.5);
}

これを使用。

final ScrollView scrollView = (ScrollView) view.findViewById(R.id.scroll_view);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(0, convertDpToPx(60), 0, 0);
scrollView.setLayoutParams(lp);

これで、端末毎の高さが変わる事はないかなと、、stackoverflow.com