OnClickListenrを使ってボタンがクリックされたときの処理を書くときの話。
規模や宗派は分かれるところですが、リスナーをimplementsさせたり、ボタン毎にOnClickListenerを用意するやり方は自分はしません。(処理が散らばるのが嫌だから)
自分は、以下のように直接setOnClickListener()に無名クラスを渡す方法で実装する派です。
findViewById(R.id.save_bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// クリックしたときの処理
}
});
しかし、onClickの中から無名クラスの外側の変数はスコープできません。
// この変数をonClickの中で使いたい
int id = 1;
findViewById(R.id.save_bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
update(id); // 変数idはスコープできない
}
});
id変数をわざわざメンバ変数に持たせるのは嫌だし、拡張するのもめんどくさい。
この形をキープしたまま値を渡すやりかたはないのでしょうか…
結論、無名クラスに独自メソッド + メンバを実装をします。
こんな感じ。
// この変数をonClickの中で使いたい
int id = 1;
findViewById(R.id.save_bt).setOnClickListener(new View.OnClickListener() {
private int id;
@Override
public void onClick(View v) {
// クリック処理
update(id);
}
public View.OnClickListener setId(int id) {
this.id = id;
return this;
}
}.setId(id));
もっとシンプルに美しくやる方法があればぜひ教えてください。
Androidはチーム開発したことないのでお作法的なものがいまいちわかりません。
Kotlinならもっとうまいことやれるのかもしれませんね。