Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

Androidアプリ開発をはじめた

Nexus 5を常用しているAndroidユーザになってしばらく経つので、そろそろAndroidアプリを作りたい気持ちになってきた。先日、そのためにMacBook Proを新調したほどの、気の入れようである。ちょうど3連休だったので、2日目・3日目を使って、あれこれ調べながら、初めてのAndroidアプリ開発をしてみた。

kentaro/palimpsest · GitHub

やりたかったこと

まずは簡単なタスク管理ツールを作ってみようと思った。こんな感じ。

  • 毎日習慣的に行いたいタスクがいくつかあるので、ちゃんと習慣的に行えるよう管理したい
  • タスクは、名前と回数からなる(例: 腕立て伏せを30回する、英和辞典を5ページ読む、みたいな)
  • また、ちゃんとしなかった場合は、前日以前の回数が今日の分に加算されるので、ちゃんと毎日やらないと大変なことになる

画面

ほぼ「sqliteのテーブル1つに対するCRUDを提供するだけのアプリ」といってよいものなのでたいしたことはやっていない。

トップ画面。タスクが並んでいる。それぞれのタスクの数字は、1日のノルマ回数 * タスクをやらなかった日数が表示されている。サボると大変なことになる(以下の場合、3日サボるとスクワットを300回やんないとならなくなる)。

右上のボタンを押して、タスクの新規作成。

リストのタスクをタッチすると、編集と削除。

わかりにくいけど、チェックボックスをチェックすると、その日のノルマが消える(タスクそのものが消えるのではなくて)。スワイプでやりたかったけど、面倒そうなので断念した。

学習に際して注意したこと

  • iOSの世界もそうだろうけど、Androidの世界も移り変わりが激しくて、少し前のドキュメントやノウハウがすぐに古びてしまう。なので、最新のプラクティスを学ぶことを心がけた。Androidの開発におけるベストプラクティスというドキュメントが役だった。
  • そのため、ググって得られるブログ等はありがたいけど、玉石混交という感じなので、ひとつのブログを見て真似せずに、比較検討の上で、ダサくなさそうなやりかたを採ることにした。
  • 使えそうなライブラリは使うことにした。その際、モバイル界隈でのレピュテーションをよく知らないので、そういうのを気にしながら選定したりした。

わかったこと

  • Android Studioめっちゃ便利。ショートカット憶えられないので、⌘↑Aで出てくるあれこれ操作を検索できるやつしかほとんど使ってないけど……(いまのところそれで足りてる)。
  • IdeaVimがいい感じなので、編集もかなり楽々。
  • iOSほどじゃないのかもしれないけど、すごくたくさんのライブラリがある。便利。特にアノテーションを駆使したようなものは、便利なものが多い印象。
  • 設計のパラダイムがわりとコロコロ変わっているのかな?と思われた。また、iOSに比べて自由度が高い感じがする。面倒がない反面で、どうしたらダサくないのかがあんまりわからない。
  • やっぱ憶えるべきことがたくさん。Java自体には抵抗ないし、実装についてもこういう感じでできるだろうな、というのはこれまでのあれこれの経験からわかるが、実際にどうやったらいいかは調べ回る必要があるので、時間かかる。場数踏むしかなさそう。

便利だったもの

IdeaVim

Vimmerなので、とりあえずこれがないと。

ActiveAndroid

タスクの記録にsqliteを使ったのだけど、素でやるとなんか面倒そうだったので、これを使った。使い方自体は簡単なのでドキュメントのままという感じ。

ハマった点: いったんテーブルが作られるとクラス定義をかえても反映されたりしないので、一度table自体を消す必要があった。

Otto

最近はfragmentなんてものがあるそうで、以前のようにactivityをバンバン作るみたいな感じじゃないようだ。以前に買って読むだけしていたわりと新しい本(『プロの力が身につく Androidプログラミングの教科書』)でもほとんど触れられていないし、本とかではまだあんまりベストプラクティス的なのは紹介されていないのかな。んでもって、かといってfragmentとactivityを、Android Studioが吐くひな形にもあるように密結合させちゃうとよくないから、Ottoなどのイベントバスライブラリを使うとよいとのこと。

ハマった点: 以下のようにした時に、replaceされたfragmentでsubscribeしているハンドラが呼ばれなくてつらかった。

public void switchFragmentTo(Fragment fragment) {
    getFragmentManager().beginTransaction()
            .replace(R.id.container, fragment)
            .addToBackStack(null)
            .commit();
}

layoutに背景色をつけた上で、replaceじゃなくてaddするようにした。

public void switchFragmentTo(Fragment fragment) {
    getFragmentManager().beginTransaction()
            .add(R.id.container, fragment)
            .addToBackStack(null)
            .commit();
}

Butter Knife

ドキュメントにはいろんなことが書かれていて、正直まだよくわかってないものもあるのだが、以下のものを実際に使って便利だった。

  1. viewのインジェクション
  2. アノテーションでのリスナ定義

1)については、いちいちfindViewById(...)とかなんとかするのだるすぎるなと思ってたら、これで解決だった。2)については、fragmentとかに、以下のような感じでメソッド作るだけで、リスナの匿名クラスわたして云々みたいなだるいのが解決するので、便利だった。

@Optional
@OnClick(R.id.task_form_button_delete)
public void delete() {
    this.task.delete();
    BusHolder.getInstance().post(new OnDeletedEvent(this.task));
}

よくわからないこと

おおむねよくわからないのだけど、特に、

  • fragmentの移動については、1)現在のfragmentがOttoのイベントバスを通じてイベントを投げる 2)Main Activityが拾ってハンドリングする、みたいにしているのだけど、Androidでは「戻るボタン」の存在があるために、統一的に扱えなくてしんどい。どうしたらよいのか。
  • fragmentの中でgetActivity()したら負けと思ってがんばったが、そうしないとならない時もありそう
  • Butter Knife便利だけど、匿名クラスの中であれこれやりたいこともあって、そういう時には使えるの?使えないの?よくわからんかった。
  • UI作るの、難しくて大変。fragment使ってるのでスマホタブレットとでいい感じにみたいなのできるようだけど、要素の指定とか、冗長な感じになるのかなあ?
  • デザイン的なとこ(スタイルとか画像とか)全然やってないのでまだよくわからない。

などなど。

次にやりたいこと

  • Webと連携するようなアプリを作りたい
  • デザインをちゃんとしたものを作りたい

読んだ本

ちょっと前に、Javaの復習のために以下を読んだ。

AndroidエンジニアのためのモダンJava

AndroidエンジニアのためのモダンJava

本はよさげなのが見つけられなかったが、WEB+DB PRESSの以下の号の特集がよかった。

WEB+DB PRESS Vol.81

WEB+DB PRESS Vol.81