うつ日記 ~うつを克服するための日記~

うつ病のため休職してから復帰するための体験、工夫、Androidアプリの紹介、アプリの作成ノウハウなど。アプリはこちら→ https://play.google.com/store/apps/details?id=tokin_kame.utunikki_app

画面に合わせてサイズを決める ~Androidアプリの作り方~

Androidのアプリを作る時に戸惑ったのが、端末の画面に合わせて、ボタンやスクロールなどのviewの大きさを調節すること。
端末によって解像度(1インチ幅のドット数)も違えば、画面の大きさも違うので、どの端末でも画面からはみ出したり、余計な隙間を作ったりしないようにするのは、結構難しかった。

ネットで調べると、解像度や画面の大きさを取得する方法や、画像を一旦設定して画面上でのサイズを取得する方法が見つかったので、色々試してはみたものの、上手くいかなかった。
デバイスのDPIを取得 と dip ⇔ px の変換 - 戌印-INUJIRUSHI- (Androidあれこれ) -
【Android】画面サイズに合わせて、動的にView要素のサイズの変更 - Qiita
まぁ、やり方が悪かっただけかもしれないが。
結局のところ、ぴったり合わせるのは難しかったが、簡単な方法でおおよそ上手くいったので、書き残しておく。

今回のは、大雑把に言うと、画面の大きさを取得して、viewのサイズは画面の大きさに対する比率で計算するという方法。

そもそも、画面上の部品にサイズを指定する方法には、2種類ある。
1つ目は、xmlファイルに書く方法で、文字のサイズを指定する場合には、以下のような感じ。

もう1つは、javaで後から変更する方法で、上記のxmlタグに対して、IDを使って以下のように設定する。
TextView text = (TextView) findViewById(R.id.text_id);
text.setTextSize(24);

サイズが固定のボタンやタイトルのようなものは、xmlファイルに書く方が無難。
画面に合わせて、ボタンを大きくしたり、できるだけviewを広くしたい場合には、javaで指定する方法を使うことになる。
javaで指定する場合には、多分ピクセル数を引数として与えるんだけど、いくつにすれば良いのかよくわからない。
解像度が高くなったり、画面が大きくなったりすればピクセル数が多くなるはずなので、その分引数に大きな値を入れてやれば良いのかなと思うんだけど、結局良くわからなかった。
しょうがないので、絶対値で与えるのはあきらめて、画面サイズに対する比率で与えることにした。

まず、画面サイズは以下のように取得する。
WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
Display disp = wm.getDefaultDisplay();
これで、disp.getHeight()としてやれば、画面の高さが得られるし、disp.getWidth()としてやれば、幅が得られる。
例えば、以下のようにすれば、画面の半分の幅のボタンにできる。
Button b = (Button)findViewById(R.id.button_id);
b.setWidth( (int)(Double.valueOf(disp.getWidth()) / 2.0));

スクロールビューの場合はちょっと複雑で、以下のように、一旦パラメータを取得してからサイズを指定すると上手くいった。

ScrollView scrollview1 = (ScrollView)findViewById(R.id.scroll_id);
LayoutParams params1;
params1 = scrollview1.getLayoutParams();
params1.height = (int)(Double.valueOf(disp.getHeight()) * 4.0 / 7.0);
scrollview1.setLayoutParams(params1);

ここでは、画面の大きさの4/7をサイズとして指定している。
ボタンやテキストと並べたりする時に、画面の大きさとの比率をどれぐらいにするかは、試行錯誤するしかない。
そういう意味では、かなり雑な方法ではあるけど、実用的ではある。