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

# まえがき
Qiita初投稿。バージンを貴方に捧げよう。
要らない？

…おｋ。

今回は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時の同様の操作を
試行錯誤して試したので、そちらもまとめ次第投稿しようと思います。

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