update.OnClickListenerの実装方法について煩悶としています。どのように書くのが美しいのでしょうか。Activity,Fragmentに実装する方法Button等を表示するActivityやFragmentに実装させる方法があります。}}一般的だと思います。見るコードですが、個人的にはイマイチだと思っています。publicなonClick個人的にpublicなonClick()というメソッドが作られてしまうことが気になります。下記のようなことができてしまいます。SampleFragment();fragment.onClick(null);やりませんけどね。以下のようなこともできてしまいます。findViewById(R.id.button1);button.setOnClickListener(fragment);やりませんよ?やりませんが、できてしまうということが気になります。1つしかないonClickこの方法は、クリック時の処理を一箇所にまとめられるメリットがあるようです。可読性が高まるのでしょうか。switchでViewのID毎に処理を振り分けるのが一般的だと思います。}}美しくないですね。可読性を意識される方は、こんないろんな処理がダラダラと続くようなコードを書いたりはしないはず。ボタン毎にメソッドに切り出しましょう。}}メソッドが小さくなって読みやすくなりました。なるとonClick()が大した仕事をしていません。こんなonClick()が必要でしょうか。大した仕事をしないonClick()を使わないように、ボタン毎にOnClickListenerを用意するようにしましょう。}};クリック時の処理が必要なViewに対して、上記OnClickListenerのインスタンスを渡してあげれば良いですね。view.findViewById(R.id.button1).setOnClickListener(button1ClickListener);view.findViewById(R.id.button2).setOnClickListener(button2ClickListener);view.findViewById(R.id.button3).setOnClickListener(button3ClickListener);onClick()を消したので、FragmentにimplementsさせていたOnClickListenerも外しておきます。...}publicなonClick()がなくなりました。Activity,FragmentにOnClickListenerを実装するよりは、正しい姿になったように思います。setOnClickListener()に無名クラスを渡す方法privateフィールドにインスタンスを保持させても良いのですが、他で使うわけでもなし、無駄な気がします。setOnClickListener()に渡してしまいましょう。以下略これもサンプル等でよく見る形です。無駄は削ぎ落とされてきましたが、ちょっと読みにくい気がします。setOnClickListener()の中の記述量が多いからでしょうか。以下のように一時変数に代入しておくと多少は読みやすくなるような気がします。以下略いかがでしょうか。一時変数に代入したとしても、setOnClickListener()を行うメソッドにクリック時の処理という異物が紛れ込んでいることには変わりありません。読みやすさという点では低下しているように感じます。クリック時の処理をクラスにしてしまいましょうか。}}OnClickListenerを設定するところは以下のようにすっきりします。Button1ClickListener());すっきりはしますが...、ここまでやると大仰な気がしますね。ここまでしなくても、処理を別の場所に書きたいだけであれば、「無名クラスとしてprivateフィールドに実装する方法」で十分に思います。結局OnClickListenerの実装方法として、4つを挙げました。専用のクラスに実装する方法どの方法も一長一短あり、どれが一番良いとは決められません。作成するアプリにもよるかもしれません。私は2番目の「無名クラスとしてprivateフィールドに持つ方法」で実装することが多いです。クラスとしての形、読みやすさのバランスが丁度良い気がしているからです。みなさんはどのように実装しているでしょうか。どのように実装されているか、理由付きで教えていただけると幸いです。(2014/03/02)amay077さんからコメントをいただきました。上記3以外の方法では他所から参照される可能性を生みます。確かにそのとおりでした。正しくないコードが書けてしまう1で関係ないViewのsetOnClickListener()が呼べてしまったように、2,4でも同様のことができてしまいます。Button1ClickListener());これは美しくないですね。1と同様に、自分ひとりで開発していたのならば、こんなコードは書かないとは思いますが、間違えてしまう可能性はゼロではありません。setOnClickListener()に無名クラスを渡す方法」が一番良いように思えます。Androidのコードはどうなってる?Androidのソースコードではどのように実装されているのか以下のサイトで検索してみました。Projectキーワードは「setOnClickListener\(」で検索しました。setOnClickListener()に無名クラスを渡す方法」が圧倒的に多いことがわかります。Activity,Fragmentに実装する方法」も使われているようです。専用のクラスに実装する方法」は見つけられませんでした。setOnClickListener()に無名クラスを渡す方法」が美しい理由を知ることができました。Androidのコードでも多数この方法で実装されているので、「3の方法が一番美しい」と決めつけてしまっても良いかも知れません(ただ、「それ、ループの中でも同じこと言えんの?」というツッコミはありそうです)。他にもご意見ございましたら、是非お聞かせください。(2014/03/03)zaki50さんからもコメントをいただきました。アノテーションつきのメソッドを用意するだけです。私はどちらもちゃんと使ったことがなかったのですが、アノテーションをつけるだけでクリックイベントを処理できるというのは聞いたことがありました。機会なので試してみました。AndroidAnnotationsAndroidAnnotations上記リンク先でもサンプルコードを見ることができますが、OnClickListenerに関する部分は以下のように書くことができます。上記のコードだけで、setOnClickListener()相当の処理も含まれています。調べただけでも、以下のことができるようです。@Clickをつけたメソッドは、メソッド名と同じIDを持つViewのClickListenerとして扱われる(R.id.button1←→button1())OnClickListenerと同じように引数にViewを取ることができる@ClickにViewのIDを指定すると、任意のメソッド名をつけることもできるメソッドをprivateにすることはできないっぽい他にもできることがあるかもしれませんが、パッとわかったのはこれくらい。Knifeを使った場合、以下のように書くことができます。}}こちらもすごいですね。@OnClickにViewのIDを指定することは必須のようですが、AndroidAnnotationsとは違った便利さがありそうです。@OnClickにViewのIDを指定して利用する。確かにこれらを使うとコードがすっきりします。これらのライブラリは、メソッド名を自由に付けられたり、引数の有無を選択できたりと、美しいコードを書けるように作られているんだな、とも感じました。私もこれからのプロジェクトでは積極的に使っていきたいと思いました。いったライブラリはどれくらいの割合の人たちが利用しているんでしょう?また、先に挙げた4つの実装方法の選ばれている割合も気になります。Qiitaにアンケートのような機能があったらよかったのに。(2014/03/09)shunsugai@githubさんからコメントいただきました。layoutのxmlでandroid:onClick属性を使うという方法もあります。確かにそんなやり方もありました。shunsugaiさんも「あまり使いませんが...」と前置き付きで紹介くださいました。使い方を書いておきます。layout.xmlに以下のようにandroid:onClickという項目を記述します。/>その上で、Activityに以下のように書きます。}これだけでこのメソッドが呼ばれるようになります。ActivityにOnClickListenerを実装する必要もありませんし、setOnClickListener()を呼ぶ必要もありません。これだけ見ると便利そうな感じもしますが、これ、美しくないんですよね...。ActivityにOnClickListenerを実装する方法と同様に、publicなメソッドを実装しなければいけない。Fragmentにはこの方法が使えない。Activityにしか使えない(たぶん?)。メソッドを実装し忘れる(もしくは名前を間違える等)すると、実行時に例外が発生する。Activityのみを見たときに、メソッドがどこから呼ばれているのかわからない。今、使っている人はあまりいないんではないでしょうか。コメントを頂いたので追記してみました。初めからこれくらい網羅して「OnClickListener実装方法まとめ」というようなタイトルで公開した方が良かったかもしれませんね。upLoginユーザーは見つかりませんでした。