Androidプログラミング クックブック

残念ながら、書籍を読んだだけでは、実用的なアプリを作れません。

書籍を読む目的は以下の通りで、実用的なアプリを作成するための準備に過ぎません。

  • Javaの基本的な文法を覚える
  • Eclipse with ADT(Android Development Tools)プラグインを中心とするツールの使い方を覚える
  • Google社のドキュメントを読んだり、インターネットに溢れている情報を取捨選択したりするための、基本的な知識を身に付ける

また、書籍に書かれていることをすべて覚えることは不可能です。

そのため、アプリを作り始めると、以下のプロセスを何度も何度も繰り返すことになります。

  1. やりたいことのやり方が分からない、あるいは、思い通りに動作しない、という問題に直面する。
  2. Google社のドキュメントを読んだり、書籍を読み返したり、インターネットで検索したりして、解決策を探す。
  3. 通常、解決策が複数見つかるので、実際に試すなどしてベストと思われる解決策を選択する。

結構単純な問題でもこのプロセスには時間がかかりますので、同じ問題に関して何度もこのプロセスを繰り返すのはバカバカしいです。そこで、弊社では、クックブックを作成し、問題が解決する度に、その解決策を追記するようにしています。ブックマークをまとめたり、Evernoteのようなアプリを利用したりする手もありますが、一遍のドキュメントとしてまとめておく方が良いと考えています。

社内用のドキュメントですが、私がこの先何年生きられるか分かりませんので、公開することとしました。

目次を以下に示しますので、内容をご確認の上、こちらから『Androidプログラミング クックブック [Kindle版]』をお求め頂けますと幸いです。

なお、開発環境はWindowsのEclipse with Android Development Tools (ADT) plug-inを使用すること、また、SDK Version 8以上を対象とし、Support Libraryを使用して開発することを前提としています。

目次

  • 命名規則

    • 1. プロジェクト名
    • 2. アプリケーション名
    • 3. パッケージ名
    • 4. クラス名
    • 5. メソッド名
    • 6. プロパティ名・変数名
    • 7. 定数(public static final)
    • 8. リソース名とid
    • 9. SQLite
    • 10. Conventions(しきたり)
  • ADTの操作

    • 1. 命名規則に準拠する
    • 2. キーボード・ショートカット
    • 3. sdk\tools、sdk\platform-tools、jdkx.x.x_xx\binにPathを設定する
    • 4. ProGuardを有効にする
    • 5. Google Play services APIを使用する

      • 5.1 Google Play services SDKのインストール
      • 5.2 プロジェクト側の設定

        • 5.2.1 Google Play services library projectの参照
        • 5.2.2 AndroidManifest.xmlに<meta-data>を追加
        • 5.2.3 ProGuardの設定
      • 5.3 プログラムでの対応
    • 6. プロジェクトをインポートする場合の注意
    • 7. クラスを生成する際の注意
    • 8. 9-patch画像を作る

      • 8.1 9-patch画像とは
      • 8.2 9-patch画像の形式
      • 8.3 9-patch画像の作り方
    • 9. アプリのリリース(Google Play)

      • 9.1 署名用のキー
      • 9.2 Google Maps APIのリリースキー
      • 9.3 Launcher用Application Icon
      • 9.4 コードをリリースバージョンに変更6
      • 9.5 プロジェクトのディレクトリの整理
      • 9.6 ADTでリリースビルド
      • 9.7 ビルドしたアプリをテスト
      • 9.8 Google Play用のリソース
      • 9.9 Google Playでリリース
      • 9.10 その他
      • 9.11 注意すること
  • Androidプログラミング

    • 1. ログの出力・非出力の制御
    • 2. Logに出力するTAGの指定方法
    • 3. グローバル定数の定義
    • 4. 共通のユーティリティ・メソッドの定義
    • 5. リソース

      • 5.1 色
      • 5.2 ResourceからStringやColorへの変換
      • 5.3 システム組み込みの文字列定数は使用しない
    • 6. Layout

      • 6.1 LinearLayoutにおけるchild-viewのlayout_gravity
      • 6.2 Parent Containerの一番下に配置する
      • 6.3 コンテナの背景に9-patch画像を使用する場合の注意点
      • 6.4 GridView
      • 6.5 android:textSize
      • 6.6 EditText
    • 7. View

      • 7.1 Viewの背景をあるパターンで埋める
      • 7.2 Horizontal Progress Barのカスタマイズ
      • 7.3 Seek Barのカスタマイズ
      • 7.4 CheckBoxのカスタマイズ
      • 7.5 Android組み込みの星形のチェックボックスを使う
      • 7.6 TextViewに数字を表示する
      • 7.7 EditTextで入力が終了した時に動作をさせたい
      • 7.8 EditTextで現在表示されている文字列を取得する
      • 7.9 ImageButtonを使用する際の注意点
      • 7.10 コードでImageButtonのsrcを変更する
      • 7.11 ImageButtonをToggleButtonのように動作させたい
      • 7.12 WebViewの背景色を指定する
      • 7.13 WebViewの右端に表示される白い領域を削除したい
      • 7.14 xxxLayoutは、View#findViewById(int id)でキャストする必要は無い
      • 7.15 Widget.ProgressBar.Large.Inverseを使用する上での注意点
      • 7.16 ImageViewの下のWidgetを反応しないようにする
      • 7.17 ProgressBarを表示しているときに、ボタン類が反応しないようにする
    • 8. ListView、GridView

      • 8.1 ListViewのdividerを透明にする
      • 8.2 ListViewの中の項目ごとにスタイルを変える
      • 8.3 要素の数が非常に多いListViewの表示を速くする
      • 8.4 ScrollViewの中にListViewを置く
      • 8.5 ListViewを更新する
      • 8.6 GridViewにImageViewを並べる
    • 9. アニメーション

      • 9.1 フェードアウトやスライドアウトさせた画像は、INVISIBLEにすること
      • 9.2 トゥイーン・アニメーション
      • 9.3 アニメーション終了時に処理する
      • 9.4 一定時間後に画面を変える
      • 9.5 コンテナの中心からコンテナいっぱいに大きくなるImageViewのアニメーション
      • 9.6 Fragmentを切り替える時のアニメーション
    • 10. Image

      • 10.1 clipPathを使う時の注意点
      • 10.2 あるBitmapを円形に切り抜いたBitmapを得る
      • 10.3 画面いっぱいに画像を表示する
    • 11. Fragment

      • 11.1 全面に配されたFragmentを使用するActivity
      • 11.2 Master/Detail Fragment

        • 11.2.1 タブレット用のデュアルペイン・レイアウト
        • 11.2.2 エイリアスの設定
        • 11.2.3 Callbacksインターフェースの定義
        • 11.2.4 parent-Activity(MasterActivity.java)
      • 11.3 Fragmentのインスタンスを生成する際に、引数を渡す
      • 11.4 Fragmentの入れ子
      • 11.5 FragmentにTouchイベントを処理させる
      • 11.6 FragmentのonResume()ライフサイクル・メソッドでの注意
      • 11.7 Freagment中の処理でThreadの切り替えを伴う場合の注意
    • 12. Dialog

      • 12.1 Dialogを表示するDailogFragment
      • 12.2 「はい」「いいえ」の2つのボタンのあるDialogFragment
      • 12.3 アプリの評価を依頼する
      • 12.4 DialogFragmentのメッセージ部分に画像を表示する
      • 12.5 FragmentからDialogFragmentを使う
    • 13. ActivityとIntent

      • 13.1 フルスクリーンActivity
      • 13.2 Screen OrientationをLandscape(横長)に固定する
      • 13.3 Intentに対応するActivityがあるかどうかのチェック
    • 14. Service

      • 14.1 Serviceから同一Application内のFragmentにMessageを送る
      • 14.2 Foreground Service
    • 15. データベース

      • 15.1 SQLiteを使う
      • 15.2 SQLiteでBooleanを保存する
      • 15.3 あるIDのレコードを抽出する
      • 15.4 空のレコードをInsertする
      • 15.5 Updateの例
      • 15.6 全レコードを削除して、削除したレコード数を知る
      • 15.7 queryをバックグラウンドで実行する
    • 16. ネットワーク

      • 16.1 AndroidManifest.xml
      • 16.2 ユーティリティ・クラス
    • 17. 位置情報

      • 17.1 Location APIの使い分け
      • 17.2 AndroidManifest.xml
      • 17.3 GPS衛星の情報を見る
      • 17.4 位置情報の取得について
      • 17.5 位置情報のフィルタリング
      • 17.6 Location#getTime()とSystem.currentTimeMillis()
    • 18. Google Maps (Android API v2)

      • 18.1 Google Maps APIを使う

        • 18.1.1 Google Play services SDK
        • 18.1.2 Google Maps API key
        • 18.1.3 AndroidManifest.xml
        • 18.1.4 layoutファイル
        • 18.1.5 コード
        • 18.1.6 ライセンスに関する記述
      • 18.2 所定の領域にズームする
      • 18.3 Google Mapに拡大やチルトに連動する画像を張り付ける
      • 18.4 MarkerのzIndex
      • 18.5 Google Maps Android API Utilityを使う

        • 18.5.1 Google Maps Android API Utilityのインストール
        • 18.5.2 プロジェクト側の設定
    • 19. In-app Billing(Version 3)

      • 19.1 In-app Billing Libraryをプロジェクトに追加する
      • 19.2 商品にSKUを割り当てる
      • 19.3 Google Play Developer Consoleにアプリを登録する
      • 19.4 AndroidManifest.xmlの設定
      • 19.5 コード

        • 19.5.1 TrivialDriveで定義されている主なクラスとインターフェース
        • 19.5.2 Google Playとのコネクションを確立する
        • 19.5.3 購入可能な商品をチェックする
        • 19.5.4 商品を購入する
      • 19.6 アプリをリリースモードでビルドする
      • 19.7 リリースモードでビルドしたアプリをアップする
      • 19.8 アプリ内で販売する商品を登録する
      • 19.9 テスト用のアカウントを登録する
      • 19.10 アプリを公開する
      • 19.11 リリースビルドした.apkファイルをデバイスに転送する
      • 19.12 テストの売上の取り消し
    • 20. AdMob

      • 20.1 広告ユニットIDの取得
      • 20.2 Google Play services SDK
      • 20.3 AndroidManifest.xml
      • 20.4 /res/values/strings.xml
      • 20.5 layoutファイル
      • 20.6 コード
      • 20.7 テスト用のデバイスIDの設定
    • 21. Miscellaneous

      • 21.1 Unique Device ID
      • 21.2 SharedPreferencesを使う
      • 21.3 AsyncTaskにおいて引数の受け渡しがない場合
      • 21.4 Worker ThreadからUI Threadへのアクセス
      • 21.5 ThreadのRunnableの中で、そのThreadを立ち上げたFragmentへアクセスする
      • 21.6 Callback
  • トラブルシューティング

    • 1. ADTのエラー

      • 1.1 This Android SDK requires Android Developer Toolkit version 22.6.1 or above. Current version is 22.2.1.v201309180102-833290. Please update ADT to the latest version.
    • 2. ビルド時エラー

      • 2.1 The method zoomTo(float) in the type CameraUpdateFactory is not applicable for the arguments (double)
      • 2.2 do {} while()で、doの{}の中でdeclareしたローカル変数はwhile内では参照できない
      • 2.3 Syntax error on token "int", Dimensions expected after this token
    • 3. 実行時エラー

      • 3.1 Could not find class 'maps.ae.i', referenced from method maps.af.al.a
      • 3.2 The Google Play services resources were not found. Check your project configuration to ensure that the resources are included.
      • 3.3 android.view.InflateException: Binary XML file line #56: Error inflating class android.widget.SeekBar
      • 3.4 android.view.InflateException: Binary XML file line #7: Error inflating class <unknown>
      • 3.5 android.content.res.Resources$NotFoundException: String resource ID #0x64
      • 3.6 java.lang.IllegalStateException: Map size should not be 0. Most likely, layout has not yet occured for the map view.
      • 3.7 MapViewの上に重ねたViewをonCreateViewでINVISIBLEにすると、以後、表示できなくなる
      • 3.8 FragmentのAsyncTaskでgetActivity()でエラーが出る
      • 3.9 JSONTokener#nextValue()でjava.lang.ClassCastException: java.lang.Stringが発生
      • 3.10 java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
      • 3.11 android.database.sqlite.SQLiteException: database is locked
      • 3.12 実機デバイスにロードする際に、'Flushing content description cache.' has encountered a problem.と表示される
      • 3.13 エラーメッセージは出ないが、Canvas関連が、シミュレーターでは動作するのに、実機デバイスでは動作しない
      • 3.14 リリースモードのAPKファイルをデバイスにインストールしたら、Google Mapの画面が真っ白になった
      • 3.15 AdMobを追加したら、The Google Play services resources were not found. Check your project configuration to ensure that the resources are included.というエラーメッセージが赤く表示される
      • 3.16 In-App Bilingのテストで、「購入しようとしたアイテムが見つかりませんでした」と表示される
  • クイックリファレンス

    • 1. drawableのフォルダ名と解像度
    • 2. State List Drawables
    • 3. ImageViewのandroid:scaleType
  • Java

    • 1. 初期化されていない変数の値
    • 2. String

      • 2.1 一致比較
      • 2.2 空文字列かどうかのチェック
      • 2.3 プリミティブやオブジェクトを文字列に変換
      • 2.4 秒を表す数値をMM:SSやH:MM:SSのように変換
    • 3. 数値の型の変換
    • 4. Generics
    • 5. WeakReference<T>クラス
    • 6. 主なコレクション
    • 7. Iterableインターフェース
    • 8. Singleton
  • 一般的な知識

    • 1. Nonzero-rule