Android onClickから外側の変数にアクセスしたい

Android

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ならもっとうまいことやれるのかもしれませんね。

タイトルとURLをコピーしました