Upload
hiroshi-hayama
View
281
Download
0
Embed Size (px)
Citation preview
アプリのつくりかた、ここがわからん!
全体像が見えない! どこまでがあらかじめ作られているもの? あらかじめ作られているものはどう動くの? デザインした画面とコードの関係が謎
おまじないの意味を知りたい! 参照を取得するってどういうこと? イベントリスナーの () や {} が複雑すぎて…… final って何?
…… などなど。それらの意味やしくみを解きほぐしていきましょう!
ともあれ、アプリを作ってみましょう!
ステップ 1 : Android Studio の起動から、新規アプリの作成まで 手順はデモンストレーションします はじめてアプリを作る人がつまづく謎の箇所につい
て、詳しく説明します 分からないところは気にせずにどんどんやればいい…… とよく言われますが、やっぱり気になりますよね
謎解きその 1
Company Domain アプリを一意に識別するための名前 ドメイン名を使うのがならわし
Package name Java のプログラム
(クラス)をまとめておくために使う
関連のあるクラスをひとまとめにしておくと便利(ですよね)
次は、画面のデザインですね
ステップ 2 :画面のデザインに進みましょう 同様に、手順はデモンストレーション 謎解きをしながら……
ウィジェットの配置やプロパティの設定については、それほど謎はないですね
実は、整数値が(自動的に)割り当てられています!
R.id クラスで定義されています この整数値を使って、ウィジェットを識別します(詳細はま
た後述) ちなみに……画像リソースは R.drawable クラスで整数値が
割り当てられています
謎解きその 3
アクティビティ( MainActivity クラス)は、 ActionBarActivityなどのクラスを継承したクラス
親クラスはアプリの画面の基本的な機能を持ったクラス それに自分で機能を追加していけばよい アプリの実行時に、自動的にインスタンスが作られます 配置したレイアウトや
ウィジェットもsetContentView メソッドにより、インスタンス化されます
ちなみに、ActionBarActivity は古くなったので、今はAppCompatActivity の使用が推奨されています
謎解きその 4
変数には値型の変数と参照型の変数がある 値型の変数には値そのものが入れられます(値型はプリミ
ティブ型とも呼ばれます) これは分かる。 int i; とかでしょ
参照型の変数にはオブジェクトの参照が入れられます。 だから、参照って何!→ 参照とは、オブジェクトがどこにあるかという情報だと考えるとよい※ ここでは「オブジェクト」と「インスタンス」をほぼ同じ意味で使っています
コードを 2 つに分けて見てみましょう。Random r; …… ① 参照型の変数 r を宣言( Random クラスのオブジェクトを参照する) r = new Random(); …… Random② クラスのオブジェクトを新しく作り、その参照を r に代入する
(次のスライドに続く)
謎解きその 5
② のコード全体
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 は参照型の変数→ 参照を変更できない、ということ参照先の画像やテキストはもちろん変更できる