多くのボタンにOnClickListenerインターフェイスを実装する適切な方法は何ですか


10

私のAndroidアクティビティには、すべてOnClickListenerを必要とする複数のボタンが含まれています。私はこれを行う多くの異なる方法を見てきました:

  • アクティビティクラスでのインターフェースの実装
  • インターフェースを実装する別のクラスを作成する
  • 各ボタンの匿名内部クラスを定義します。

私はそれぞれのアプローチの多くの例を見てきました。ただし、なぜ1つのアプローチが別のアプローチの代わりに使用されるのかは、はっきりしません。これらのアプローチの違いは文体的ですか、それとも1つのアプローチを改善する理由がありますか?

回答:


6

多くのことと同様に、正しいアプローチは、特定のボタンに対して何を実行しようとしているか、およびアクティビティに対して他に何を実行しているかによって異なります。

アクティビティクラスはインターフェイスを実装します
これは、このリスナーが呼び出されたときに実行するタスクのタイプが1つしかない場合に適したオプションです。この例は、多数のフィールドと保存ボタンを持つ単純なフォームです。実際に何をする必要があるかを判断するために、イベントリスナーにイベントのソースをチェックさせないようにしています。これがスタイルだと言う人もいるかもしれませんが、リスナーがこのチェックを行う必要がないため、各イベントで何が呼び出されているかを正確に把握できるため、コードを追跡しやすくなると思います。

別のクラスがインターフェースを実装します
上記で述べたように、同じイベントを起動できる複数のアイテムがある場合は、このオプションを使用します。上記の例を拡張して、クリックリスナーも必要とするクリアボタンを追加しましょう。保存アクションを実行する1つのリスナーと、クリアアクションを実行する1つのリスナーを作成します。各リスナーは、そのアクションを生成するコンポーネントにのみ追加されます。

この実装には、気になる場合に利用できる追加の利点があります。利点は、他のクラスがアクティビティクラス内のイベントをトリガーしないようにすることです。インターフェースメソッドはパブリックでなければならないため、クラスへの参照を持つ誰でもイベントを発生させることができます。アプリケーションで誰が何を実行できるかを細かく制御したい場合は、別のクラスにより、アクティビティへの参照を持つユーザーがフォームをクリアまたは保存するのを防ぎます(または、リスナーがソースを利用している場合はコードを壊す可能性がありますが、悪い入力を処理しない)。

匿名の内部クラスはインターフェースを実装します
これは実際には、異なるクラスを実装として使用する2番目のオプションを構築する特定の方法にすぎません。他の誰もクラスのインスタンスを作成できないため、このオプションでは、イベントをトリガーするアクセス権を持つユーザーをさらに制限できます。ただし、2つのオプション間のより重要な要素は、どれだけの作業が行われているかです。いくつかのテキストフィールドをクリアすることは、単純明快な操作です。ただし、forを保存するプロセスには、入力を検証し(実行する必要があります)、データベースに書き込んで値を保存し、保存後のアクションをトリガーするという、多くのタスクが含まれる可能性があります。この場合、独自のファイルを使用して別のクラスを作成すると、入力フォームとデータ処理の間の明確な区別が提供されます。これにより、複数の内部クラスがネストされた大きなファイルではなく、フォームコードが保持されます。


うわー、あなたの応答をありがとう。オーバーヘッドに関して、複数のリスナークラスを作成する方がコストがかかりますか?
スレイトン

@slayton:何をしても、常に費用がかかります。質問は「違いはあなたにとって重要ですか?」より多くのオブジェクトを作成することには重みがありますが、リスナーがソースのリストを調べて実際に何をするかを決定する必要がある場合、実行時間は長くなります。メモリの使用状況とパフォーマンスが重要な場合は、コードをプロファイルし、要件に基づいて最適なものを決定する必要があります。ただし、これがコードのボトルネックになるとは思えません。特に明記されていない限り、コードをより明確に整理するために決定を行ってください。
unholysampler

3

4番目の方法は、レイアウトでonClick属性を設定することです。

<Button android:onClick="clickHandlerForButtonX" />

アクティビティにこの対応するメソッドがあります:

public void clickHandlerForButtonX(View v) {
    //Handle Button X here
}

興味深いことに、私はあなたがそれができるとは知りませんでした。これはボタンのクリックを処理するAndroid固有のメカニズムのようですが。
スレイトン

私は通常、「Activityクラスはインターフェースを実装します」を使用します-そのようにして、同じ場所にすべてのクリックに関連するものがあります。
orjan 2009

この特定のメソッドはフラグメントでは機能しません。
Rahul Tiwari
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.