2015年6月11日木曜日

ぼくのインデント

インデントは無ではない

みんなで1つのファイルを編集していると、
インデントで殴り合いになることがある。

たとえば、TAB派とSPACE派だ。

多くのエディタではデフォルトでTABもSPACEも表示しない。
そのためこのような悲しい戦いが繰り返される。

私はこの憎しみの連鎖に終止符を打ちたい。

以下が平和の呪文だ。起床時に3回唱えよう。

Eclipseの人

[環境設定] - [Java] - [Code Style] - [Formatter] - [New…]

[Tab Policy] を Spaces only に変更

他の人

ぐぐって。

わたしはSPACE派だ

実機で開いている画面からActivityのクラスを特定する裏ワザ

裏ワザではない

ソースが見れるでっかいアプリを試しに動かしている時に、
この画面はどのActivityクラスなんじゃ?と思うことがある。
入れ歯型の歯ブラシがあったらガシガシ噛むだけで歯が磨けるんじゃね?とちょうど同じくらいの頻度で思う。

裏ワザ紹介!!!!1

そんなときはUSBでAndroid端末とPCをつなぎ、以下のコマンドを実行する。

adb shell dumpsys activity | grep Run

これでok。Activityのスタックが表示される。

grepが使えないWindowsなキミはおとなしくfindstrでもつかってな。

レイアウトはどこからやってくるか

レイアウトの旅

レイアウトをどこで設定して、どこで読み取って、どこでインスタンス化しているのかの話。

Inflate

インフレ・デフレという言葉が示すように、Inflateとはなにかをでっかくすることだ。ジンバブエな。
AndroidでInflateといえば、レイアウトデータをレイアウトインスタンスにふくらませることだ。

レイアウトデータ

レイアウトデータはxmlだ。
xmlはHTMLで触れたことある?あるな?よっしゃ、

<LinearLayout
    android:layout_width="wrap_content" 
    ... >
   <TextView 
       android:text="Hello Big Gorilla!" 
       ... />
</<LinearLayout>

こんなかんじ。それを

GorillaProject/res/layout/my_cool_layout.xml

のような場所にいい感じの名前で格納する。
(ファイル名として使える文字に厳しい制限があるゾ)

レイアウトインスタンス

View root = inflater.inflate(R.layout.my_cool_layout);

inflaterってなに?というキミの当然浮かぶであろう疑問は無視するとして、これによってrootには先のレイアウトデータで定義したなかの「最も親のView」 = LinearLayoutのインスタンスが格納される。

そう、LinearLayoutのインスタンスだ。だから、

LinearLayout layout = (LinearLayout) root;

ができる。

inflateでは、xmlファイルという指示書に従って、Viewのインスタンスをnewしていくというわけだ。

Inflateなんてないじゃん

あるActivityでは、こんなふうに書かれている。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_cool_layout);
}

こういうときはsetContentViewのなかでInflate処理しているんだよ。大丈夫。
Inflateを内部的に呼び出している関数はたくさんあるよ。

Activity, Fragment, そして View

目に見えるもの

Android アプリをつくろうぜってなっても、なにから考えればいいかわからんね。
例えば、AndroidのBluetoothの扱いに興味を持つ人がいてもいいんだろうけどそういう人はこことか読まない。

まずは目に見えるものを考えるよね。

Activity

いわゆる画面。1つの画面が1つのActivityだ。
こいつのなかにモノをつっこむことで、アプリはできあがるのだ。

Fragment

昔はなかったんだけど、いまは必須なやつ。
Activityの中を小分けにするやつ。
弁当箱で言うと「ばらん」で分けられた区域のこと。ご飯とおかず。
ただちょっと注意しないといけないのは、こいつは非表示にしたり切り替えたりできるってこと。おかず区域の「からあげ」をタップすると、ご飯区域の「白米」が「チャーハン」になる感じな。

View

部品。Activityのなかに直に置くこともできるし、Fragmentの中に置くこともできる。「からあげ」や「白米」や「チャーハン」のこと。食べ物ではない。

Viewは入れ子にできるものがある。これは「からあげおにぎり:だ。白米の中にからあげを入れることができる。
しかし、からあげのなかに白米をいれることはできないように、入れ子に出来ないViewもある。

階層構造

実体があるのがViewだ。目に見えるぞ。
それらの入れ物がActivityとFragmentだ。
FragmentはActivityの中に置くことができる。

これ階層構造だね。レイアウトヒエラルキーだね。