LoginSignup
14
12

More than 5 years have passed since last update.

androidアプリでレイアウトをJavaで適用しようとして投げ出しそうになった時

Posted at

まえがき

Qiita初投稿。バージンを貴方に捧げよう。
要らない?

…おk。

今回はxmlで書いてたレイアウトを諸事情でjavaに置き換えることになったから、
その時に調べた事と詰まったとこをメモしてく的なやつね。

対象

androidでJavaによるレイアウト適用したくなった時に
変数の下の赤にぴょろぴょろが消せなくて無力感を感じた貴方。

或いは、手持ちのandroidアプリ制作のための本が入門過ぎてxmlについてしか書いて無くて
google先生に頼ったらここに来てしまった哀れな貴方。

基本

setContentView("XMLのID")ってonCreateで書いてあげると簡単に適用されるから普通はこれでいい。
しかし、大人の都合でヤダヤダ言われることもある。

そんな時はjavaでレイアウトを書いて適用させるわけだけど、
さっそく例を下に。

example.java
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // 例えばベースとしてLinearLayout作成
    LinearLayout linearLayout = new LinearLayout(this);

    // 例えばさっき作ったベースにViewを配置
    view = new View(this);
    linearLayout.addView(view);

    // 完成したレイアウトをxmlでのレイアウトの時でも馴染み深い`setContentView()`で画面に出す   
    setContentView(linearLayout);

ってことで、レイアウトを作ってそこに作ったViewなりパーツを追加してって完成したのをsetContentViewで画面に出してあげる。
っていうのが基本の流れ。

私でも分かった。きっとみんな大丈夫。

プロパティを設定

この辺りがJavaでレイアウトするときの面倒なところ。
xmlだとandroid:layout_widthとかで簡単に設定できたけど、
Javaの場合は以下のような具合で設定を適用させる。

example.java
    Button testBtn = new Button(this);

    // textを設定したり
    testBtn.setText("test text");

    // 位置を指定したり
    testBtn.setGravity(CENTER);

この辺りで詰まった点があったので共有
結論からいうとRelativeLayout以外ではGravityで位置調整しようってことです。

当初xmlでLinearLayoutに対してandroid:layout_alignParentTop="true"って
設定してちゃんと位置の調節できてたから問題ないと思っていたんだけど、

Javaのコードに置き換えようとしたときにこんなサンプルコードがあったので、LinearLayoutに置き換えて使ったみたらエラー。
え、え、なんで?なったのね。

example.java
// こういうサンプルがあったから
RelativeLayout.LayoutParams lp = createParam(WC, WC);
lp.addRule(RelativeLayout.POSITION_TO_RIGHT, 1);

// LinearLayoutにして使ってみたらダメってなる
LinearLayout.LayoutParams lp = createParam(WC, WC);
lp.addRule(LinearLayout.POSITION_TO_RIGHT, 1); //addRuleってメソッドはないよ。と

調べたらaddRule()ってメソッドはRelativeLayout.LayoutParamsクラスにあるもので
LinearLayout.LayoutParamsに無いっていうね。

google先生の情報を適当に受け止めて勝手に解釈するとダメだよっていう基本的なお話でした。。

gravityでの位置設定

パーツ一般で使えるGravityの位置の設定パラメータ一覧を。
直訳ごめん。

int型 AXIS_CLIP 生のビットは、左/右下端が適用されて重力方向に基づいて、そのコンテナにクリッ​​ピングされているかどうかを制御する。
int型 AXIS_PULL_AFTER 生のビットは、左/右下端が配置される方法を制御する。
int型 AXIS_PULL_BEFORE 生のビットは、トップ/左エッジを配置する方法を制御する。
int型 AXIS_SPECIFIED 軸の重力を示す生のビットが指定されています。
int型 AXIS_X_SHIFT 横軸を定義するビット。 int型 AXIS_Y_SHIFT 縦軸を定義するビット。
int型 BOTTOM そのサイズを変更していない、その容器の底にオブジェクトをプッシュします。
int型 CENTER そのサイズを変更していない、垂直方向と水平方向の両方の軸で、そのコンテナの中央にオブジェクトを配置します。
int型 CENTER_HORIZONTAL そのサイズを変更していない、そのコンテナの水平方向の中央にオブジェクトを配置します。
int型 CENTER_VERTICAL そのサイズを変更していない、その容器の垂直方向の中央にオブジェクトを配置します。
int型 CLIP_HORIZONTAL 水平軸に沿って、そのコンテナにオブジェクトのエッジをクリップするフラグ。
int型 CLIP_VERTICAL 垂直軸に沿って、そのコンテナにオブジェクトのエッジをクリップするフラグ。
int型 DISPLAY_CLIP_HORIZONTAL 特殊な水平の次元に沿ってディスプレイ全体にクリッピングを有効にする定数。
int型 DISPLAY_CLIP_VERTICAL 特殊な垂直の次元に沿ってディスプレイ全体にクリッピングを有効にする定数。
int型 END そのサイズを変更していない、そのコンテナの末尾にx軸の位置にオブジェクトをプッシュします。
int型 FILL それは完全にそのコンテナを埋めるように必要に応じてオブジェクトの水平方向および垂直方向のサイズを拡張する。
int型 FILL_HORIZONTAL それは完全にそのコンテナを埋めるように必要に応じてオブジェクトの水平方向のサイズを拡大します。
int型 FILL_VERTICAL それは完全にそのコンテナを埋めるように必要に応じてオブジェクトの垂直方向のサイズを拡大します。
int型 HORIZONTAL_GRAVITY_MASK 重力の絶対水平重力を得るためのバイナリマスク。
int型 LEFT そのサイズを変更していない、そのコンテナの左側にあるオブジェクトをプッシュします。
int型 NO_GRAVITY は重力が設定されていないことを示す定数
int型 RELATIVE_HORIZONTAL_GRAVITY_MASK 水平方向の重力とスクリプトを特定の方向ビットのバイナリマスク。
int型 RELATIVE_LAYOUT_DIRECTION 生のビットが(代わりに絶対LEFT / RIGHTの開始/> 終了)のレイアウト方向が相対的であるかどうかを制御する。
int型 RIGHT そのサイズを変更しないと、そのコンテナの右側にオブジェクトをプッシュします。
int型 START そのサイズを変更していない、そのコンテナの開始時に、x軸の位置にオブジェクトをプッシュします。
int型 TOP そのサイズを変更しないと、そのコンテナの上部にオブジェクトをプッシュします。
int型 VERTICAL_GRAVITY_MASK バイナリマスクでは、重力の垂直方向の重力を取得します。

原文はこちら。
http://developer.android.com/reference/android/view/Gravity.html

addRule()で相対レイアウト時の位置設定

RelativeLayoutで相対的に物の位置を指定するときはこちらを。

int型 ABOVE 別の子の上端との子供の下端を揃えルール。
int型 ALIGN_BASELINE 別の子供のベースラインと子供のベースラインを揃えルール。
int型 ALIGN_BOTTOM 別の子の下端との子供の下端を揃えルール。
int型 ALIGN_END 別の子の終端と子の終端を揃えルール。
int型 ALIGN_LEFT 別の子の左端と子供の左端を揃えルール。
int型 ALIGN_PARENT_BOTTOM そのRelativeLayout親の下端との子供の下端を揃えルール。
int型 ALIGN_PARENT_END そのRelativeLayoutの親の端縁と子の終端を揃えルール。
int型 ALIGN_PARENT_LEFT そのRelativeLayoutの親の左端に子供の左端を揃えルール。
int型 ALIGN_PARENT_RIGHT そのRelativeLayoutの親の右端と子供の右端を揃えルール。
int型 ALIGN_PARENT_START そのRelativeLayoutの親の開始エッジと子の始端を整列ルール。
int型 ALIGN_PARENT_TOP そのRelativeLayoutの親の上端との子供の上端を揃えルール。
int型 ALIGN_RIGHT 別の子の右端と子供の右端を揃えルール。
int型 ALIGN_START 別の子供の開始エッジと子の始端を整列ルール。
int型 ALIGN_TOP 別の子の上端との子供の上端を揃えルール。
int型 BELOW 別の子の下端との子供の上端を揃えルール。
int型 CENTER_HORIZONTAL そのRelativeLayout親の境界に対して水平に子供を中心としたルール。
int型 CENTER_IN_PARENT そのRelativeLayout親の境界に関して子供を中心としたルール。
int型 CENTER_VERTICAL そのRelativeLayout親の境界に対して垂直に子供を中心としたルール。
int型 END_OF 別の子の終端を持つ子供の始端を整列ルール。
int型 LEFT_OF 別の子の左端と子供の右端を揃えルール。
int型 RIGHT_OF 別の子の右端と子供の左端を揃えルール。
int型 START_OF 別の子供の開始エッジと子の終端を揃えルール。
int型 TRUE

…揃えルール。
原文はこちら。
http://developer.android.com/reference/android/widget/RelativeLayout.html

最後に

分かってしまえば造作もないことだけれど、分からないから分からないことが分からない。
レイアウトが動的に反映できるようになると色々表現の幅も広がるし、素敵UI/UXの一歩として欠かせないとも思うので
これからもしっかり基礎を体系的に学びながら覚えていきたい。

予告

今回の件と同時にActivity向けにxmlレイアウトの動的切り替え、併せてFragment時の同様の操作を
試行錯誤して試したので、そちらもまとめ次第投稿しようと思います。

レイアウト、簡単そうで(簡単なんだけど)奥が深い。

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12