狠狠撸

狠狠撸Share a Scribd company logo
講義用資料
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は参照型の変数
→参照を変更できない、ということ
参照先の画像やテキストはもちろん変更できる
まだまだ謎は尽きませんが……
続きはいずれまたの機会に!
お疲れさまでした ……

More Related Content

0720 abc seminar