37
からしっかり につく Android アプリ : ヤフー 帯が える大 2018 6 1 第1

基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

基本からしっかり身につく Androidアプリ開発入門

: ヤフーの黒帯が本気で伝える大切な基本技

森洋之 著

2018年 6月 1日 初版第1刷発行

Page 2: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

基本からしっかり身につく Androidアプリ開発入門 SBクリエイティブ(Informatics & IDEA)

• はじめに• chapter 1 アプリ開発の準備

– 1-1 Androidアプリの現在

∗ Androidアプリの概要

– 1-2 アプリ開発の流れ

∗ 企画∗ 制作∗ 開発∗ テスト∗ リリース∗ サポート∗ column 初期の設計を大切に

– 1-3 アプリ開発環境の準備

∗ Windowsでの開発環境の準備

∗ Macでの開発環境の準備

∗ Android Studioの起動

∗ column Android Studioのアップデートとツール追加のメッセージ

– 1-4 Android Studioの概要

∗ Android Studioのメイン画面

∗ メニューバー・ツールバー・ナビゲーションバー∗ column Instant Run機能について

∗ プロジェクトビュー∗ 編集エリア∗ ツールウィンドウ・ステータスバー∗ プロジェクトの基本設定∗ column Gradleと Groovy

– 1-5 エミュレータでの実行と AVDの設定

∗ AVD Managerで AVDの追加・設定を行う

∗ エミュレータで Hello World!を実行する

∗ エミュレータの操作方法∗ AVDを日本語化する

∗ column エミュレータを高速化する Intel HAXMの起動に関する注意

– 1-6 実機の接続と設定

∗ Android端末の開発者モードを有効化する

∗ PCに USBドライバを導入する

∗ 実機でアプリを実行する• chapter 2 Kotlinプログラミングの基本

– 2-1 Kotlin と REPL

∗ Kotlinの登場

∗ Kotlin REPL

2

Page 3: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

基本からしっかり身につく Androidアプリ開発入門 SBクリエイティブ(Informatics & IDEA)

∗ はじめての Kotlinプログラム

– 2-2 Kotlinの基本

∗ 変数と基本のデータ型∗ オブジェクトの集合∗ 条件式∗ 繰り返し

– 2-3 関数

∗ 関数∗ 第一級オブジェクトとしての関数∗ 例外処理

– 2-4 クラス

∗ クラス∗ 継承∗ null許容型

– 2-5 その他のトピック

∗ スコープ関数∗ コレクションの便利な API

∗ 拡張関数∗ インライン関数∗ objectキーワード

• chapter 3 Androidアプリを構成する要素

– 3-1 Androidアプリのコンポーネント

∗ Androidアプリのエントリーポイント

∗ アクティビティ∗ フラグメント∗ サービス∗ コンテントプロバイダ∗ ブロードキャストレシーバ

– 3-2 コンポーネントのライフサイクル

∗ アクティビティのライフサイクル∗ フラグメントのライフサイクル∗ サービスのライフサイクル∗ コンテントプロバイダのライフサイクル∗ ブロードキャストレシーバのライフサイクル∗ column ライフサイクルの可視化

– 3-3 静的リソースと単位

∗ Android Studioでのリソースファイルの場所

∗ 文字列や数値∗ レイアウト∗ 画像データ

3

Page 4: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

基本からしっかり身につく Androidアプリ開発入門 SBクリエイティブ(Informatics & IDEA)

∗ その他の画像リソース∗ Androidの単位系

– 3-4 セキュリティデザインとパーミッション

∗ Androidのアーキテクチャ

∗ Androidのセキュリティデザイン

∗ パーミッション∗ パーミッションの取得方法

• Chapter 4 はじめてのアプリ 割引計算機アプリで学ぶレイアウトと動作の基本

– 4-1 アプリ開発の概要とプロジェクトの作成

∗ 画面遷移について∗ アプリ開発の流れ∗ プロジェクトの作成∗ column パッケージとアプリケーション ID

– 4-2 入力画面のレイアウト作成

∗ 編集エリアに「activity main.xml」を開く

∗ デザインエディターで編集する方法∗ テキストビューを配置する∗ ConstraintLayoutに接続する

∗ エディットテキストを配置する∗ 割引率入力欄を追加する∗ ボタンを配置する

– 4-3 さまざまな端末に対応する

∗ さまざまな画面でのレイアウト確認∗ 文字列リソースの定義

– 4-4 入力画面の実装

∗ 起動画面用のMainActivity

∗ クリックイベントのハンドリング∗ 画面の追加∗ 画面の遷移

– 4-5 計算結果画面の実装

∗ 計算結果画面のレイアウト作成∗ 計算結果画面の実装

– 4-6 アプリの動作確認とデバッグ

∗ まずはエミュレータで実行してみる∗ デバッグ実行

– 4-7 さまざまなユーザー環境に対応する

∗ リソースを管理して英語環境と日本語環境に対応する∗ さまざまな環境に合わせるリソースについて

• chapter 5 データの永続化とリスト表示 世界時計アプリで学ぶデータの扱いとリスト表示

– 5-1 データの永続化と SharedPreferences

4

Page 5: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

基本からしっかり身につく Androidアプリ開発入門 SBクリエイティブ(Informatics & IDEA)

∗ Androidでのデータ永続化

∗ SharedPreferencesの仕組み

∗ SharedPreferences用ミニアプリ

– 5-2 リストビューでリスト表示を行う

∗ ビューをリスト表示する∗ リストビュー用ミニアプリ

– 5-3 世界時計アプリの作成

∗ 時刻表示画面の作成∗ 時刻表示画面の実装 (その 1)

∗ アダプターの作成∗ タイムゾーン選択画面の作成∗ 時刻表示画面の実装 (その 2)

• chapter 6 通信とバックグラウンド処理 RSSリーダーアプリで学ぶ非同期通信処理

– 6-1 非同期処理とローダー

∗ 非同期処理やスレッド間通信のための方法– 6-2 リサイクラービューを使う

∗ リサイクラービューについて∗ 各画面項目の並べ方を決めるレイアウトマネージャー∗ リサイクラービューのアダプター∗ column リサイクラービューとサポートライブラリ

∗ リサイクラービュー用ミニアプリ∗ column ライブラリと build.gradle

– 6-3 RSSリーダーアプリのレイアウト

∗ レイアウトの作成– 6-4 RSSリーダーアプリの通信とデータ表示

∗ ネットワーク通信処理∗ XMLデータを解析する

∗ RSS用データクラスの作成

∗ RSS用パーサーの作成

∗ ローダーの作成∗ アダプターの作成∗ アクティビティの作成

– 6-5 アプリにWebページを表示する

∗ Webページをアプリで表示する 3つの方法

∗ 記事をタップしたときの処理の実装– 6-6 定期ジョブ機能の追加

∗ Androidの通知について

∗ 通知を送る手順∗ アクションの設定∗ スタイルの設定

5

Page 6: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

基本からしっかり身につく Androidアプリ開発入門 SBクリエイティブ(Informatics & IDEA)

∗ RSSリーダーアプリの通知用関数

∗ バックグラウンドで動作するサービス∗ 定期実行とジョブサービス∗ RSSリーダーアプリのジョブサービス

• chapter 7 ファイル入出力とフラグメントの利用 メモ帳アプリで学ぶファイルとフラグメント

– 7-1 ファイルの入出力とストレージ

∗ Androidのストレージ

∗ File API用ミニアプリ

– 7-2 アクティビティとフラグメント

∗ フラグメントの利用方法∗ フラグメントの使い方をミニアプリで学ぶ

– 7-3 メモ帳アプリの作成

∗ フラグメントのレイアウト作成∗ ファイルを扱うための関数を作成する∗ メモ入力用のフラグメントを作成する∗ ファイル一覧表示用のフラグメントを作成する

– 7-4 アップバーとナビゲーションドロワー

∗ メモアプリのフラグメントの表示方法∗ アクティビティのレイアウトを作成する∗ タブレット用のレイアウトを作成する∗ アクティビティを修正する

• chapter 8 ユーザーの位置と行動の記録 行動記録アプリで学ぶ位置情報の処理と地図

– 8-1 Google Maps Android APIについて

∗ Google Maps Android APIについて

∗ Google APIキーの取得

∗ Google Maps用ミニアプリについて

– 8-2 データベースを使用する

∗ SQLiteデータベースについて

∗ SQLiteOpenHelperクラスを実装する

∗ SQLiteデータベースオブジェクトの取得とデータ操作

∗ SQLiteデータベース用ミニアプリについて

– 8-3 行動記録アプリの作成

∗ プロジェクトの設定∗ データベースの作成∗ 位置情報を受け取るサービスの作成∗ 位置情報の取得をリクエストするフラグメントの作成

– 8-4 行動記録アプリを完成させる

∗ レイアウトファイルの編集∗ 地図の表示とマーカーの設置∗ スイッチフラグメントに onActivityResult()を伝える

6

Page 7: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

基本からしっかり身につく Androidアプリ開発入門 SBクリエイティブ(Informatics & IDEA)

∗ 日付を選択可能にする∗ アクティビティの再生成に対応する

• Chapter 9 アプリの公開

– 9-1 デジタル署名された apkファイルを作成する

∗ アプリケーション IDについて

∗ Key storeの生成と apkファイルの署名

– 9-2 Google Playでの公開

∗ デベロッパー登録を行う∗ アプリを公開する

• Index

7

Page 8: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3
Page 9: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

9

chapter 1 アプリ開発の準備

01 Androidアプリの現在

Androidアプリの概要

02 アプリ開発の流れ

企画  : どんなアプリを作り上げるかのゴールを決める

制作  : アプリのデザインを検討し、必要なパーツを作成する

開発  : アプリを開発していく

テスト : アプリが正常に動作するか、また品質面で問題がないかを検証する

リリース: アプリにデジタル署名を行い、Google Playに公開する

サポート: ユーザーの反応やデータをもとに、アップデート企画を行う

企画

誰が必要としているか

ターゲットを明確にすることによって、不要な機能を削ぎ落とし、必要な機能に絞って開発を進めることができる。

コアバリュー:そのアプリの最も重要な価値

制作

アプリのデザインを行う

「誰が」「いつ」「どうやって」使用するアプリなのか、ユースケースを定義する

Photshop, Sketch, InVision, Prott

開発

AndroidStudio

• 制作のステップで決定したデザインに従ってリソースファイルを作成し、UIパーツを配置するなどのデザインをアプリに反映していく作業

• 各UIパーツに対するユーザの入力に応じた処理をコーディングする作業

Page 10: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 1 アプリ開発の準備 0.1. 03 アプリ開発環境の準備

テスト

• Android端末

• Android SDK エミュレータ

• Espresso

リリース

Google Play 登録

国際化:アプリのタイトルや説明、スクリーンショットなどは言語別に設定

サポート

ユーザーからフィードバックされるバグなどの不具合への対応

column 初期の設計を大切に

よいUX (User Experience:ユーザー体験)

• リリース後の大きな方向転換は、ユーザーに新たな学習を強いることになる• 改修を重ねるたびに複雑さが増していき、いずれ大きな工数をかけなければならなくなる• 不具合も多く、使いづらい

0.1 03 アプリ開発環境の準備

Android Studio install

04 Android Studioの概要

10

Page 11: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

11

chapter 2 Kotlinプログラミングの基本

01 Kotlin と REPL

Kotlinの登場

1. 実用主義

2. 簡潔

3. 安全

4. 相互運用性

Kotlin REPL

REPL(Read-Eval-Print Loop) コマンドごとに実行して結果を表示する対話型実行環境

Android Studio [Tools] - [Kotlin] - [Kotlin REPL]

はじめての Kotlinプログラム

/* はじめての

  Kotlinプログラム */ ---------------------------------- 1

data class User(val name : String, var point : int = 0) ---- 2

// ユーザー名:ポイントの形式で全件表示 -------------------- 3

fun printUsers(users : List<User>) { --|

users.forEach { user -> --|------ 4

print("${user.name} : ${user.point} \n") --|

} --|

}

• 1, 3 コメント

• 2 User クラス

• 4 funキーワード printUser関数

val people = listOf(User("Tarou", 100), User("Hanako"), User("Jirou", 50))

Page 12: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 2 KOTLINプログラミングの基本

printUsers(people)

Tatou : 100

Hanako : 0

Jirou : 50

02 Kotlinの基本

変数と基本のデータ型

オブジェクトの集合

配列

val fruits = arrayOf("apple", "orange", "grape", "peach")

fruite[0]

apple

リスト

val fruite = listOf("apple", "orange", "grape", "peach")

fruite[1]

orange

変更可能なリストは、mutableListOf

マップ

val fruite = mapOf("a" to "apple", "b" to "banana", "c" to "citrus")

fruite["a"]

apple

コレクションと変数の変更可能性

レンジ

1 .. 10

12

Page 13: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 2 KOTLINプログラミングの基本

条件式

if

when

引数を取らない when

繰り返し

for文

while文と do ~ while文

03 関数

関数

関数の定義と呼び出し

単一式関数

デフォルト引数

名前付き引数

可変長引数

Unit型

第一級オブジェクトとしての関数

関数オブジェクト

関数型

ラムダ式

例外処理

04 クラス

クラス

クラスの定義とインスタンス化

プロパティ

プライマリコンストラクタ

セカンダリコンストラクタ

可視性修飾子

継承

クラスの継承

メソッドのオーバーライド

インターフェイス

抽象クラス

データクラス

null許容型

? 13

Page 14: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 2 KOTLINプログラミングの基本

安全呼び出し

エルビス演算子

遅延初期化

!!演算子

プラットフォーム型

安全キャスト

05 その他のトピック

スコープ関数

scope function

Standard.kt

• let関数

• apply関数

• run関数

• with関数

• also関数

let関数

apply関数

コレクションの便利な API

filter

map

maxBy, minBy

find

forEach

拡張関数

インライン関数

objectキーワード

オブジェクト宣言

コンパニオンオブジェクト

オブジェクト式

14

Page 15: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

15

chapter 3 Androidアプリを構成する要素

01 Androidアプリのコンポーネント

Androidアプリのエントリーポイント

アクティビティ

サービスアクティビティ

コンテントプロバイダ

ブロードキャストレシーバ

アクティビティ

サービスアクティビティ

アクティビティ

アプリ 別のアプリ

図 1 Androidアプリは複数のエントリーポイントを持つことができ、コンポーネント同士で協力し合える

アクティビティ

アプリの画面を表示するためのコンポーネント

インテントを持つ。明示的インテント、暗黙的インテント

フラグメント

サービス

バックグラウンドで動作するコンポーネント

Page 16: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 3 ANDROIDアプリを構成する要素

画面ごとのロジックやインターフェイスはフラグメントにして、アクティビティはその管理だけを行う

アクティビティ A

フラグメントA フラグメントB

画面ごとに複数のアクティビティを用意して、ロジックやインターフェイスもすべて管理する

アクティビティ A

アクティビティ B

図 2 ユーザーインターフェイスとロジックをフラグメントにしてアクティビティを単純化

アプリ A

アクティビティ A アクティビティ Bアプリ B

サービス

図 3 サービスはバックグラウンドで動作するコンポーネント

コンテントプロバイダ

コンテントプロバイダを通してデータをやり取りできる

他のコンポーネント

コンテントプロバイダ 実データ

図 4 コンテントプロバイダを通してデータをやり取りできる

ブロードキャストレシーバ

ブロードキャストインテントを受け取ったタイミングでアクションする

16

Page 17: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 3 ANDROIDアプリを構成する要素

サービスブロードキャストレシーバ

システムや、他のアプリから通知

図 5 ブロードキャストインテントを受け取ったタイミングでアクションをする

02 コンポーネントのライフサイクル

アクティビティのライフサイクル

状態が変化するごとに、Activityクラスのコールバックメソッドが呼ばれるそれぞれの状態に対応して処理を追加す

ることができる

アクティビティがバックグラウンドにある場合、いつプロセスが終了するかはわかりません。そのため、必ず保存し

て置かなければならないデータがある場合には、onPause()で行うこと。

フラグメントのライフサイクル

公式サイト

サービスのライフサイクル

コンテントプロバイダのライフサイクル

ブロードキャストレシーバのライフサイクル

column ライフサイクルの可視化

03 静的リソースと単位

Android Studioでのリソースファイルの場所

[res] 以下

ファイル名:拡張子を除いて、半角小文字の英数字またはアンダースコアのみ使用

文字列や数値

[res] - [values]

17

Page 18: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 3 ANDROIDアプリを構成する要素

別のアクティビティが開始

起動

実行中

プロセス終了

破棄

アクティビティが非表示

再度このアクティビティを開く

他のアプリのためにメモリが必要になった

再表示

再表示

onCreate()

onStart()

onRestoreInstanceState()

onResume()

onPause()onSaveInstanceState()

onStop()

onDestroy()

onRestart()

図 6 アクティビティのライフサイクル

レイアウト

[res] - [layout]

View と ViewGroup

18

Page 19: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 3 ANDROIDアプリを構成する要素

表 1 リソースとして定義する値の種類

種別 タグ 意味と使い方

文字列 string

複数形表現 plurals

整数 integer

真偽値 bool

文字列の配列 string-array

整数の配列 integer-array

任意の配列 array

色 color

単位付きの値 dimen

スタイル style

属性 attr

画像データ

[res] - [drawable], [mipmap]

9-patch

その他の画像リソース

ステートリスト

形状

アニメーション

Androidの単位系

px

px(pixel:画素)ディスプレイ上の1ドット

dpi

dpi(dots per inch:1インチあたりのドット数)

dp

dp(density-independent pixels:密度非依存画素数)

sp

sp(scale-independent pixels:スケール非依存画素数)

19

Page 20: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 3 ANDROIDアプリを構成する要素

04 セキュリティデザインとパーミッション

Androidのアーキテクチャ

Androidのセキュリティデザイン

パーミッション

パーミッションの取得方法

OSが Andorid 6.0 未満か、ターゲット SDKバージョンが 23 未満の場合

OSが Andorid 6.0 以降かつ、ターゲット SDKバージョンが 23 以上の場合

20

Page 21: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 3 ANDROIDアプリを構成する要素

フラグメント追加

onAttach()

onCreate()

実行中

破棄

再表示

onCreateView()

onActivityCreated()

onStart()

onResume()

onDestroy()

フラグメントがbackstackに置かれた

フラグメントが削除された

onPause()

onDestroyView()

onDetack()

フラグメントが再度レイアウトに置かれた

onStop()

ユーザが再度このアクティビティを開く

プロセス終了

他のアプリのためにメモリが必要になった

図 7 フラグメントとコールバックメソッドの遷移状態

21

Page 22: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 3 ANDROIDアプリを構成する要素

startService() で起動

onCreate()

onStartCommand()

実行中

終了

onDestroy()

stopService() または、stopSelf() で停止する

startService() で起動

onCreate()

onStartCommand()

実行中

終了

onDestroy()

全クライアントがunbindService() でバインド解除する

図 8 サービスのコールバックメソッドと状態遷移

ユーザーインストールアプリプリインストールアプリ

アプケーションフレームワーク

Android システムサービス

HAL

Linux カーネル

App API

Binder

JNI(Java Native Interface)

図 9 Androidのアーキテクチャ

22

Page 23: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

23

Chapter 4 はじめてのアプリ

割引計算機アプリで学ぶレイアウトと動作の基本

01 アプリ開発の概要とプロジェクトの作成

画面遷移について

• 遷移元の画面に結果が戻ってこない場合• 遷移先での結果を遷移元に返す場合

アプリ開発の流れ

1. プロジェクトの作成

2. リソースの作成

3. 画面レイアウトの作成

4. 機能の実装

5. マニフェストファイルの定義

6. テスト・デバッグ

プロジェクトの作成

アプリ名

サポートする APIレベル

リソースの作成

画面レイアウトの作成

完成した画面イメージを予め作っておく

機能の実装

マニフェストファイルの定義

テスト・デバッグ

プロジェクトの作成

Application name Calculator

Page 24: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 4 はじめてのアプリ

Company domain sample.android.exanple.com

Project location Y=

Package name com.example.android.sample.calculator

Include C++ support チェックなし

Include Kotlin support チェック

columnパッケージとアプリケーション ID

02 入力画面のレイアウト作成

編集エリアに「activity main.xml」を開く

編集エリアのレイアウトファイルを編集するには

1. デザインエディター

2. テキストエディター

デザインエディターで編集する方法

ConstraintLayoutとビューグループ

ConstraintLayout ビュー同士の位置に制約を設定することでレイアウトする

その他のビューグループ

RelativeLayout 配置されたビュー同士の相対的な位置関係で規定する

LinearLayout 水平方向や垂直方向に並べて配置する

FrameLayout 基本的には一つのビューの配置に利用

TableLayout 表形式の配置 電卓ボタンのような配置に使える

テキストビューを配置する

textView

text 定価

textAppearance AppCompat.Large

layout margin ?, 48dp, 48dp, ?, ?

24

Page 25: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 4 はじめてのアプリ

ConstraintLayoutに接続する

画面のサイズに応じて自動的にマージンを変化させる方法

エディットテキストを配置する

editText Number

id price

layout margin ?, 32dp, ?, 48dp, ?

layout width match constraint

割引率入力欄を追加する

textView

text 割引率

textAppearance AppCompat.Large

layout margin ?, 48dp, 48dp, ?, ?

ボタンを配置する

Button

id calculate

text 計算する

03 さまざまな端末に対応する

さまざまな画面でのレイアウト確認

文字列リソースの定義

04 入力画面の実装

起動画面用のMainActivity

プロジェクトを作成した直後の「MainActivity.kt」の内容

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

25

Page 26: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 4 はじめてのアプリ

}

}

次の処理を実装する

1. ボタンがタップされたときに入力値の妥当性を確認して、定価や割引率が未入力の場合にはエラーを表示する

2. 入力値に問題がなければ計算結果画面に遷移する

クリックイベントのハンドリング

View

TextView ViewGroup

ConstraintLayout

図 10 Viewはすべての UIクラスのスーパークラス

ボタンへの参照を取得して、ボタンにクリックイベントリスナーを登録する

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

val button = findViewById<Button>(R.id.calculate)

button.setOnClickListener {

// ここに任意の処理を実装する

// 妥当かどうか

var isValid = true

val priceEditText =findViewById<EditText>(R.id.price)

val priceText = priceEditText.text.toString()

if (priceText.isEmpty()) {

// 定価が未入力

priceEditText.error = "定価を入力してください"

isValid = false

26

Page 27: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 4 はじめてのアプリ

}

val discountEditText = findViewById<EditText>(R.id.discount)

val discountText = discountEditText.text.toString()

if (discountText.isEmpty()) {

// 割引率が未入力

discountEditText.error = "割引率を入力してください"

isValid = false

}

if (isValid) {

// 文字列を整数型に変換

val price = Integer.parseInt(priceText)

val discount = Integer.parseInt(discountText)

// ここで画面遷移を行う

}

}

}

画面の追加

1. Activity、またはそのサブクラスを継承したアクティビティクラスを作成する

2. 表示するレイアウトを作り、アクティビティクラスの onCreate()コールバック内で setCantentView()メソッ

ドで設定する

3. マニフェストファイル「AndroidManifest.xml」内で、アプリに含まれるアク的ビティに追加する

[app] - [java] - [com.example.android.sample.calculator] 右クリック

[New] - [Activity] - [EmptyActivity] - ResultActivity

画面の遷移

// ここで画面遷移を行う

val intent = Intent(this, ResultActivity::class.java)

intent.putExtra("price", price)

intent.putExtra("discount", discount)

startActivity(intent)

27

Page 28: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 4 はじめてのアプリ

05 計算結果画面の実装

計算結果画面のレイアウト作成

上のテキストビュー

ID expression label

textAppearance AppCompat.Large

text @string/expression : %1$,3d円の%2$d%%引きは

下のテキストビュー

ID result label

textAppearance AppCompat.Large

text @string/result : %1$,3d円です

計算結果画面の実装

割引価格を計算して表示する

class ResultActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_result)

// 入力画面で Intentに詰めた値を取り出す

val price = intent.getIntExtra("price", 0)

val discount = intent.getIntExtra("discount", 0)

val expression = findViewById<TextView>(R.id.expression_label)

expression.text = getString(R.string.expression, price, discount)

// 割引後の価格を計算

val discountedPrice = price * (100 - discount) / 100

val result = findViewById<TextView>(R.id.result_label)

result.text = getString(R.string.result, discountedPrice)

}

}

28

Page 29: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 4 はじめてのアプリ

06 アプリの動作確認とデバッグ

まずはエミュレータで実行してみる

デバッグ実行

07 さまざまなユーザー環境に対応する

リソースを管理して英語環境と日本語環境に対応する

さまざまな環境に合わせるリソースについて

29

Page 30: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3
Page 31: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

31

chapter 5 データの永続化とリスト表示

世界時計アプリで学ぶデータの扱いとリスト表示

Key-Value形式でのデータの保存方法

01 データの永続化と SharedPreferences

Androidでのデータ永続化

File API

SharedPreferenced

SQLiteデータベース

コンテントプロバイダについて

SharedPreferencesの仕組み

Key-Value形式でデータを簡単に保存・読み書きできるクラス

まずメモリに反映する

バックグラウンドで永続化する

アプリxml

ファイル

ShartedPreferences

メモリ

図 11 データはまずメモリに反映されてから、バックグラウンドでファイルに永続化される

SharedPreferences用ミニアプリ

Application name SharedPreferences

Plain Text

ID editText

Page 32: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 5 データの永続化とリスト表示

xmlファイル

ShartedPreferences

キャッシュから高速に値を返す

未キャッシュならファイルから読み込む

アプリ メモリ

図 12 xmlファイルの読み込みは同期的に行われる

Button

ID store

text 保存

SharedPreferencesからの値の取得と保存(「MainActivity.kt」)

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

val pref = getSharedPreferences("file_name", Context.MODE_PRIVATE)

// プリファレンスから、保存されている文字列を取得

// まだ保存されていない場合は”未登録”を返す

val storedText = pref.getString("key", "未登録")

val editText = findViewById<EditText>(R.id.editText)

editText.setText(storedText)

val button = findViewById<Button>(R.id.store)

// ボタンタップされたときの処理

button.setOnClickListener {

// テキストボックスに入力されている文字列

val inputText = editText.text.toString()

// プリファレンスに保存する

pref.edit().putString("key", inputText).apply()

}

32

Page 33: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 5 データの永続化とリスト表示

}

}

1. Context.getSharedPreferences() メソッドで、指定したファイル名の SharedPreferences オブジェクトを取得

する。

2. SharedPreferences.getString() メソッドなど、データの型に応じたメソッドで保存されているデータを読み

取る。

3. SharedPreferences.edit() メソッドで編集用の Editor オブジェクトを取得して、Editor.putString() メソッド

などデータの方に応じたメソッドでデータを編集し、最後に Editor.apply() か Editor.commit() で、変更を

SharedPreferencesに反映する。

02 リストビューでリスト表示を行う

リストビュー(ListView)、リサイクラービュー(RecyclerView)をつかう

ビューをリスト表示する

リストビュー用ミニアプリ

タイムゾーンをリスト表示する

Application name ListView

Legacy - ListView

ID timeZoneList

layout width match constraint

layout height match constraint

layout Layout resource file

[File name] list time zone raw

Text

ID timeZone

text 保存

リストビューの使用方法(「MainActivity.kt」)

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

// 画面のレイアウトを指定する

setContentView(R.layout.activity_main)

33

Page 34: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 5 データの永続化とリスト表示

// リストで表示するタイムゾーンの一覧

val timeZones = TimeZone.getAvailableIDs()

// リストをレイアウトから探す

val listView = findViewById<ListView>(R.id.timeZoneList)

// アダプターを作成

val adapter = ArrayAdapter<String>(this,

R.layout.list_time_zone_row,

R.id.timeZone,

timeZones)

// リストにアダプターをセットする

listView.adapter = adapter

// リストのアイテムタップ時の動作

listView.setOnItemClickListener { parent, view, position, id ->

// アダプターから、押された位置のタイムゾーンを得る

val timeZone = adapter.getItem(position)

// Toastで表示

Toast.makeText(this, timeZone, Toast.LENGTH_SHORT).show()

}

}

}

03 世界時計アプリの作成

世界時計アプリのプロジェクト

Application name WorldClock

時刻表示画面の作成

TextClockビュー

デザインエディターにはないため、テキストエディターで追記

<androidx.constraintlayout.widget.ConstraintLayout

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

34

Page 35: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 5 データの永続化とリスト表示

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity">

<TextClock android:layout_width="wrap_content" android:layout_height="wrap_content"/>

</androidx.constraintlayout.widget.ConstraintLayout>

時刻表示画面の実装 (その 1)

デフォルトタイムゾーンの名前を表示する(「MainActivity.kt」)

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

// ユーザのデフォルトタイムゾーンを取得する

val timeZone = TimeZone.getDefault()

// タイムゾーン名を表示する TextView

val timeZoneView = findViewById<TextView>(R.id.timeZone)

// タイムゾーン名を表示

timeZoneView.text = timeZone.displayName

// 「追加する」ボタンをレイアウトから探す

val addButton = findViewById<Button>(R.id.add)

// 「追加する」ボタンがタップされたら、タイムゾーン選択画面に遷移する

addButton.setOnClickListener {

val intent = Intent(this, TimeZoneSelectActivity::class.java)

// 遷移先画面からの結果を受け取りたい場合

startActivityForResult(intent, 1)

}

}

35

Page 36: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

第 0. CHAPTER 5 データの永続化とリスト表示

startActivityForResult()

onActivityResult()

遷移元アクティビティ

setResult()

遷移先アクティビティ

startActivityForResult()でアクティビティを起動する

setResult()で結果をセットする

戻るボタンや finish()メソッドで遷移先アクティビティに戻る

setResult()でセットした結果を受け取る

図 13 startActivityForResult()で画面遷移を行い、onActivityResult()で結果を受け取る

アダプターの作成

タイムゾーン選択画面の作成

時刻表示画面の実装 (その 2)

36

Page 37: 基本からしっかり身につく Android アプリ開発入門 · chapter 2 Kotlin ... { 6-5 アプリにWeb ページを表示する Web ページをアプリで表示する3

37

chapter 6 通信とバックグラウンド処理

RSSリーダーアプリで学ぶ非同期通信処理