戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
10

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ウィジェットにイベントを設定

ウィジェットにイベントを設定するには、イベントリスナーと呼ばれるインターフェースを使用します。

インターフェースの使用方法には、インプリメントするか、匿名クラス(無名クラス)の2種類があります。
インプリメントには、アクティビティにインプリメントする方法と、イベントリスナークラスを作成してそれにインプリメントする方法があるので、正確には3種類でしょうか…

オライリー社の書籍曰く、匿名クラスを使用した場合には約1キロバイトのメモリを余計に使用するため、インプリメントする方が良いそうです。


以下のサンプルは、ボタンのウィジェットをクリックした時にトースト通知するようになっています。

インプリメントで実装
package jp.inujirushi.sample;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class SampleActivity extends Activity
implements View.OnClickListener {

/** アクティビティを生成したときに呼ばれます。 */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// ボタンにクリックイベントを設定
findViewById(R.id.button1).setOnClickListener(this);
}

/** ビューをクリックしたときに呼ばれます。 */
@Override
public void onClick(View view) {
// クリックされたビューに応じて処理を分岐
switch (view.getId()) {

// ボタンがクリックされた時
case R.id.button1:
Toast.makeText(this, "ボタンが押されました",
Toast.LENGTH_LONG).show();
break;
}
}
}
9行目でアクティビティにView#OnClickListenerをインプリメントしています。
17-18行目ではボタンにクリックイベントを設定し、引数に this を付ける事でアクティビティとイベントを紐付けています。
これで、ボタンをクリックする事で21-33行のイベント処理が実行されるようになります。

この方法だと複数のウィジェットにクリックイベントを設定した場合、同じView#onClickメソッドが呼ばれてしまいます
そこで、引数のViewからgetId()を呼んで、ウィジェットの android:id を取得して判別します。

上記の理由により、ソースコードが冗長になってしまうことから匿名クラスを使用して実装する手法が多用されています。
インプリメントで実装されたソースコードを匿名クラスに書き換えると以下の様になります。

匿名クラスで実装
package jp.inujirushi.sample;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class SampleActivity extends Activity {

/** アクティビティを生成したときに呼ばれます。 */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// ボタンを取得
Button button = (Button) findViewById(R.id.button1);
// ボタンにクリックイベントを追加
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// ボタンが押されるとトーストが表示される
Toast.makeText(SampleActivity.this,
"ボタンが押されました",
Toast.LENGTH_LONG).show();
}
});
}
}
この様に、匿名クラスで実装するとインプリメントされたときよりも可読性が良くなります。
(良くなっていると思っています)
ネストが深くなってしまいますが、そこはカプセル化するなどで対応できます。

個人的にも匿名クラスでの実装の方が好きですが、優先すべきはメモリ
MVCアーキテクチャによる実装手法のこともあるしインプリメントでの実装が正しそうです。
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。