26
講講講講講 ABC2015 Summer 講講講講講講講講 Android 講講講講講講講講講 講講講講講講講 講講講講講講講講講 講講 講

0720 abc seminar

Embed Size (px)

Citation preview

講義用資料

ABC2015 Summerいまからはじめる Android アプリのつくりかた

有限会社ローグ・インターナショナル羽山 博

予定・内容

時間: 14:00 〜 14:45 内容: Android アプリのつくりかた

簡単なおみくじプログラムを例として しくみの理解を中心に: × なんとなくできた→○わ

かった!

アプリのつくりかた、ここがわからん!

全体像が見えない! どこまでがあらかじめ作られているもの? あらかじめ作られているものはどう動くの? デザインした画面とコードの関係が謎

おまじないの意味を知りたい! 参照を取得するってどういうこと? イベントリスナーの () や {} が複雑すぎて…… final って何?

…… などなど。それらの意味やしくみを解きほぐしていきましょう!

ともあれ、アプリを作ってみましょう!

ステップ 1 : Android Studio の起動から、新規アプリの作成まで 手順はデモンストレーションします はじめてアプリを作る人がつまづく謎の箇所につい

て、詳しく説明します 分からないところは気にせずにどんどんやればいい…… とよく言われますが、やっぱり気になりますよね

謎その 1 :プロジェクト作成時の謎

Company Domain って何? Package name って何?

謎解きその 1

Company Domain アプリを一意に識別するための名前 ドメイン名を使うのがならわし

Package name Java のプログラム

(クラス)をまとめておくために使う

関連のあるクラスをひとまとめにしておくと便利(ですよね)

謎その 2 :アクティビティ作成時の謎

Activity Name って何? Layout Name って何?

謎解きその 2

これです!

次は、画面のデザインですね

ステップ 2 :画面のデザインに進みましょう 同様に、手順はデモンストレーション 謎解きをしながら……

ウィジェットの配置やプロパティの設定については、それほど謎はないですね

ウィジェットはどのようにして識別するの? 画面のデザインが XML で記録されているのは分か

る id を付けて区別するのは分かる でも、なんだかモヤモヤする……

謎その 3 :デザイン時の謎

実は、整数値が(自動的に)割り当てられています!

R.id クラスで定義されています この整数値を使って、ウィジェットを識別します(詳細はま

た後述) ちなみに……画像リソースは R.drawable クラスで整数値が

割り当てられています

謎解きその 3

謎その 4 :コードの謎(アクティビティ)

Android アプリってどこから実行されるの 再び、アクティビティって何? インスタンスを作らなくてもいいの?

アクティビティ( MainActivity クラス)は、 ActionBarActivityなどのクラスを継承したクラス

親クラスはアプリの画面の基本的な機能を持ったクラス それに自分で機能を追加していけばよい アプリの実行時に、自動的にインスタンスが作られます 配置したレイアウトや

ウィジェットもsetContentView メソッドにより、インスタンス化されます

ちなみに、ActionBarActivity は古くなったので、今はAppCompatActivity の使用が推奨されています

謎解きその 4

謎その 5 :コードの謎(参照)

参照がよく分からん! 例えば、乱数を使うときのおまじないRandom r = new Random();

の意味って?

変数には値型の変数と参照型の変数がある 値型の変数には値そのものが入れられます(値型はプリミ

ティブ型とも呼ばれます) これは分かる。 int i; とかでしょ

参照型の変数にはオブジェクトの参照が入れられます。 だから、参照って何!→ 参照とは、オブジェクトがどこにあるかという情報だと考えるとよい※ ここでは「オブジェクト」と「インスタンス」をほぼ同じ意味で使っています

コードを 2 つに分けて見てみましょう。Random r; …… ① 参照型の変数 r を宣言( Random クラスのオブジェクトを参照する) r = new Random(); …… Random② クラスのオブジェクトを新しく作り、その参照を r に代入する

(次のスライドに続く)

謎解きその 5

① のコード

Random r;

r

りもこん、つくった

Random クラスのオブジェクトを参照するための変数

② のコードの右辺

new Random();r オブジェクト

nextInt メソッド

ほんたい、つくった

Random クラスで定義されたデータや機能を実体化したもの

② のコード全体

r = new Random();r オブジェクト

nextInt メソッド

ほんたいを、りもこんに、むすびつけた

• new 演算子は、作成したオブジェクトの参照を返す• それを r に代入する(データの流れは青い矢印)• r を使ってオブジェクトが操作できるようになる

(参照の方向は赤い矢印:通常はこの矢印だけを示す)

謎その 6 :コードの謎(イベントリスナー)

イベントリスナーってなんであんなに複雑?Button b = (Button)this.findViewById(R.id.buttonShow);final ImageView img = (ImageView)this.findViewById(R.id.imageDroid);final TextView t = (TextView)this.findViewById(R.id.textFortune);b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int fortune; Random r = new Random(); fortune = r.nextInt(2); if (fortune == 0) { img.setImageResource(R.drawable.good); t.setText(" 大吉 "); } else { img.setImageResource(R.drawable.bad); t.setText(" 凶 "); } }});

何段階かのコードを 1 つにまとめてしまったため!

じゃあ、段階を追って見ていけば納得できる?   できま−す!

setOnClickListener メソッドには、クリックされたときの処理を実行するオブジェクトを指定する

だから、基本はb.setOnClickListener(obj);

という 1 行だけ!

では、 obj をどうやって作るか?   こうします!−(次のスライドに続く)

謎解きその 6

OnClickListener を実装したクラスを作る

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button b = (Button)this.findViewById(R.id.buttonShow); final ImageView img = (ImageView)this.findViewById(R.id.imageDroid); final TextView t = (TextView)this.findViewById(R.id.textFortune); listener obj = new listener(); …… listener クラスのオブジェクトを作る b.setOnClickListener(obj); …… この 2 行をまとめる(次のスライド)}

public class listener implements View.OnClickListener { …… OnClickListener を実装 @Override public void onClick(View v) { …… クリックされたときに実行されるメソッド int fortune; Random r = new Random(); fortune = r.nextInt(2); if (fortune == 0) { img.setImageResource(R.drawable.good); t.setText(" 大吉 "); } else { img.setImageResource(R.drawable.bad); t.setText(" 凶 "); } }}

OnClickListener を実装したクラスを作る

protected void onCreate(Bundle savedInstanceState) {:

b.setOnClickListener(new listener()); …… obj という変数が不要になった}

public class listener implements View.OnClickListener { …… listener の部分に埋め込む(次のスライド) @Override public void onClick(View v) { int fortune; Random r = new Random(); fortune = r.nextInt(2); if (fortune == 0) { img.setImageResource(R.drawable.good); t.setText(" 大吉 "); } else { img.setImageResource(R.drawable.bad); t.setText(" 凶 "); } }}

匿名クラス(無名クラスにする)

実際に埋め込むと……b.setOnClickListener(new View.OnClickListener() { …… listener というクラス名も不要になった @Override public void onClick(View v) { int fortune; Random r = new Random(); fortune = r.nextInt(2); if (fortune == 0) { img.setImageResource(R.drawable.good); t.setText(" 大吉 "); } else { img.setImageResource(R.drawable.bad); t.setText(" 凶 "); } }});

謎ファイナル:コードの謎( final )

final って何?Button b = (Button)this.findViewById(R.id.buttonShow);final ImageView img = (ImageView)this.findViewById(R.id.imageDroid);final TextView t = (TextView)this.findViewById(R.id.textFortune);b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int fortune; Random r = new Random(); fortune = r.nextInt(2); if (fortune == 0) { img.setImageResource(R.drawable.good); t.setText(" 大吉 "); } else { img.setImageResource(R.drawable.bad); t.setText(" 凶 "); } }});

謎解きファイナル

final とは 値が変更できないようにする、ということ イベントリスナーの中で利用している→ほかの箇所

で変数の値が変更されたり、破棄されたりするのを防ぐ

img や t は参照型の変数→ 参照を変更できない、ということ参照先の画像やテキストはもちろん変更できる

まだまだ謎は尽きませんが……

続きはいずれまたの機会に!

お疲れさまでした ……