Androidプログラミング 推奨参考図書

Androidアプリのプログラミングを始めるに際しては、参考書を一冊選んで、それを読みながら、そこに記載されているサンプルコードを実際に手入力することを強くお勧めします。

Google社のドキュメントはかなり充実していますが、逆に情報過多で、どのドキュメントをどの順番で読んでいくのが良いのか、ここは読むべきなのか飛ばしても構わないのか、初心者には判断できません。

Google社のドキュメント以外にも、インターネットにはAndroidプログラミングに関する情報が溢れていますが、体型立てて記載されているサイトは私の知る限り皆無で、また、検索で上位にランクされるページは、意外と古くて役に立たないものが多いです。

その点、書籍は、なるべく新しい良書を選べば、当面必要な知識を体型立てて得ることができ、以後は、Google社のドキュメントやインターネット上の情報を効率よく利用したり、的確な情報を選択したりできるようになります。

ここでは、私が読んで、「皆様に薦めたい」と感じた書籍と、逆に「これは買ってはいけない」と感じた書籍をご紹介したいと思います。

なお、書籍はすぐに「古く」なります。物理的に古くなるのではなく、記載内容がAPIの進化や変化に合わなくなります。Androidもだいぶ「落ち着いて」きましたので、書籍に書かれている内容がすべてすぐに役に立たなくなることはありませんが、ご留意下さい。

『Android Programming: The Big Nerd Ranch Guide』

著者:
Bill Phillips、Brian Hardy
出版:
Addison-Wesley Professional
出版日:
2013年3月11日
ISBN-13:
978-0321804334

これは是非お薦めしたい本です。

英書ですが、非常にきれいな英語で書かれていて、読みやすいです。

非常に厳しいことを言うようですが、英語の読解力が無い方は、iOSにしろAndroidにしろ、独学によるアプリの開発は諦めた方が良いでしょう。それぞれ、Apple社・Google社の最新のドキュメントを読む必要があり、それらはすべて英語で書かれています。Chromeが提供するような翻訳機能を使う手もありますが、私が試した範囲では、おかしな日本語に翻訳される例が多々あり、実用には程遠い印象を受けました。

逆に英語の読解力がある方は、参考とする書籍の対象を英書まで広げると、良書に出会える確率を増やすことができます。スマートフォン用のアプリは複数言語で使えるように開発するのが一般的ですので、日本語向けに開発するからといって、特殊な手順は必要ありません。そのため、日本語で書かれた本を読む必要はありません。

英書には、文法的におかしいと思われる文章や難解な単語が頻出するような本もありますが、この本は、平易な単語で文法的にも正しい文章で書かれており、辞書をひく回数も少なくて済み、スラスラと読み進めることができます。

Android 2.2~4.2に対応しています。また、ツールはEclipse with ADTを前提としています。

Big Nerd Ranchは元々Mac向けのアプリケーションの開発に関する教育機関でしたが、近年Androidプログラミングに関するトレーニングコースも提供し始め、本書は、そのトレーニングコースのテキストをまとめたものです。実用的なアプリを開発する上で必要となる知識を一通り網羅しており、かつ、読むのが嫌になるほど多すぎず、「ほどよく」まとめられています。フォーラムも充実していますので、読んでいて疑問が生じたら、フォーラムに何か書かれていないか、覗いてみると良いでしょう。

なお、出版されてから1年以上経ちますので、内容の一部は「古く」なってしまっていますが、それでも一読する価値は十分にあると思います。

以下、目次のみ転載します。

  1. Your First Android Application
  2. Android and Model-View-Controller
  3. The Activity Lifecycle
  4. Debugging Android Apps
  5. Your Second Activity
  6. Android SDK Versions and Compatibility
  7. UI Fragments and the Fragment Manager
  8. Creating User Interface with Layouts and Widgets
  9. Displaying Lists with ListFragment
  10. Using Fragment Arguments
  11. Using ViewPager
  12. Dialogs
  13. Audio Playback Using MediaPlayer
  14. Retained Fragment
  15. Localization
  16. The Action Bar
  17. Saving and Loading Local Files
  18. Context Menus and Contextual Action Mode
  19. Camera I: Viewfinder
  20. Camera II: Taking Pictures and Handling Images
  21. Implicit Intents
  22. Two-Pane Master-Detail Interfaces
  23. More About Intents and Tasks
  24. Styles And Includes
  25. XML Drawables And 9-Patches
  26. HTTP & Background Tasks
  27. Loopers, Handlers, and HandlerThread
  28. Search
  29. Background Services
  30. Broadcast Intents
  31. Browsing The Web & WebView
  32. Custom Views and Touch Events
  33. Tracking the Device's Location
  34. Local Databases with SQLite
  35. Loading Asynchronous Data with Loaders
  36. Using Maps
  37. Afterwords

『Learning Android, 2nd Edition』

著者:
Marko Gargenta、Masumi Nakamura
出版:
O'Reilly Media
出版日:
2014年1月9日
ISBN-13:
978-1449319236

初心者はこの本を絶対に買ってはいけません。

「O'Reillyだから」という理由で、出版まもなく、レビューが1件も無いときに購入しましたが、大失敗でした。

以下、初心者にはお勧めしない理由を列記します。

  • 間違ったことが書いてあります。
    誤植や誤記ではなく、内容が間違っているのです。
    完璧な著者などいませんので、細かい間違いであれば私も目をつむりますが、基本的なことに関して間違ったことが書いてありますので、看過できません。
    一例として、Linear Layoutのlayout_weight attributeに関する記載を以下に引用します。

    The layout weight is a number between 0 and 1 that implies the weight of our layout requirements. For example, if our Status EditText had a default layout weight of 0 and required a layout height of fill_parent, the Update button would be pushed out of the screen because Status and its request for space came before the button. However, when we set the Status widget's layout weight to 1, we are saying we want all available space along the dimension of height, but will yield to any other widget that also may need space, such as the Update button. Note that layout_weight doesn't apply to a relative layout.

    Linear Layoutのlayout_weight attributeは頻繁に使用する基本的な属性です。しかるに、上記の短い文章の中に以下の4つの間違いがあります。

    1. 複数のコンポーネントの一つがlayout_widthないしはlayout_heightでfill_parent(match_parent)を設定した時にどのように配置されるかは、layout_weightとは関係ありません。
      ちなみに、「最初の」コンポーネントがlayout_widthないしはlayout_heightでfill_parent(match_parent)を設定した場合に限り、そのコンポーネントが全部の幅ないしは高さを独占します。layout_weightが設定されていようがいまいが、あるいは、その値が0であろうが1であろうが、関係ありません。
    2. layout_weightは、各コンポーネントがlayout_widthやlayout_heightで要求した幅や高さを割り当てた後、「余った領域」(remaining space)をどのような比率で割り当てるかということに用いる属性です。全体の領域をどのような比率で割り当てるかということではありません。一つのコンポーネントのlayout_weightが1で、他のコンポーネントのlayout_weightが0の場合は、layout_weightが1のコンポーネントは「余った領域」をすべて得ることができますが、全体の領域を総取りすることはできません。
    3. layout_weightには、任意の0以上の数値を使用することができます。1以下でなければならない、ということはありません。余った領域を2つのコンポーネントに割り当てる比率を2:1にしたい場合は、素直にそれぞれのlayout_weightを2と1に設定するのが普通です。わざわざ、合計が1になるように、0.6667と0.3333とする必要はありませんし、普通そのようには設定しません。
    4. 「fill_parent」は推奨されない値(deprecated)です。代わりに「match_parent」を使わなくてはいけません。

    こうした誤りは、Androidプログラミングに関して多少なりとも知識のある方は「おかしい」と気付きますが、何も知らない初心者は気付きようも無く、これを「正しい」記述として覚えてしまいます。実は「こうした事態は絶対に防がなくてはいけない」と思い、当初このページでは推奨する書籍のみを紹介する予定でしたが、「これは初心者は読むべきではない」と感じた書籍も掲載することとした次第です。

  • 記載されているコードの中に、「悪い例」(Bad Practice)があります。良い子は決して真似してはいけません。

    「悪い例」(Bad Practice)には以下の2種類があります。

    1. 「このときはこうする」というパターンを使っていません。
      例えば、Master-Detailを実現する場合は「決まったパターン」があるのですが、それを使っていないため、正しく動作しないコードになっています。
    2. 「こういうことはしてはいけない」ということをしています。
      例えば、IntentServiceのonHandleIntentでToastを呼び出しています。こうすると、Toastが消せなくなる場合がありますので、やってはいけません。実際にやってみれば、すぐに分かります。

    こうした「悪い例」は、ある程度の経験者でなければ気付きません。初心者は絶対に気付かず、悪い作法を身につけてしまいますので、絶対に読んではいけません。

  • 誤植、誤記がたくさんあります。死ぬほどあります。うんざりします。
    校正(proofread)されずに出版されたに相違ありません。

    また、重複した記載が随所に見られます。「2~3段落前にも同じことが書いてあったよな」ということが良くあります。
    編集されずに出版されたに相違ありません。

    それから、なぜか、Chapter2 Java Reviewのみ、英語が読みづらいです。

  • サンプルコードの多くがビルドエラーになったり、正しく動作しなかったりします。

    そのほとんどが、経験者であればデバッグ可能ですが、初心者は何がいけないのか分からずにパニックに陥るでしょう。

  • 私の主観的な見解ですが、書いて欲しいことが省かれています。

    恐らく、初心者をターゲットとして、なるべく簡単にしようとされたのだと思いますが、以下の2点は書いて欲しかったです。

    1. Support Libraryを使ったアプリの開発に関して書かれていません。

      AndroidはiOSと異なり、古いバージョンを搭載したバージョンが未だに多数存在します。そのため、Support Libraryを使って古いバージョンとの互換性を確保しつつアプリを開発するのが普通です。こうした「当たり前」のことは、書いてあげた方が初心者にとっては良いと思います。

    2. ネットワークの制御に関しても書かれていません。独自のライブラリを組み込むことによりごまかしています。

      ネットワークを利用するアプリを作成する機会は多く、それほど難しいことはありませんので、是非1章割り当てるぐらいのことはして欲しかったです。