ここでは、いわゆるコールバックパターンを使用します。
public class Button {
private Callback callback;
public Button(Callback callback) {
this.callback = callback;
}
public void update() {
// Check if clicked..
callback.onClick(this);
}
public interface Callback {
public void onClick(Button Button);
}
}
Button b = new Button(new Callback() {
@Override
public void onClick(Button b) {
System.out.println("Clicked");
}
});
このケースでは、onClickハンドラは、インターフェイスView.OnClickListenerを実装しています。
キーポイント:活性/断片と
- 一貫。
- activity/fragmentのメンバーへのアクセス。
- 可読性;
- @Michaelクラウスはmemory leaksについてのもう一つの良い点を示しました。 @Karakuriは、それが遅いリフレクションを使用したように、XMLファイル内
1)属性は、唯一の活性のために使用することができます。
2)匿名の内部クラスには、囲むクラスのメンバーへのアクセスに特別なルールがあります(チェック[1]、[2])。メモリリークが発生する場合があります(例:AsyncTask、Handlersを使用したスレッド化)。
3)ここでは、クラスを囲むのメンバーへのフルアクセスを持っています。
4)3Dのバリエーションです。
可読性があなたのハンドラのサイズによって異なり、小さなロジックはインラインに、コードの大きなブロックのために[OK]をすることができ、3Dと第四考えます。それは、特定のアクティビティにレイアウトを結びつけるよう
匿名の内部クラスは危険で、外部クラスを漏洩する可能性があるため、このパターンは避けてください。私は、参照が必要な場合は外部クラスへのWeakReferenceを持つ静的内部クラスを使用するか、またはアクティビティ自体をonClickListenerにすることをお勧めします。 –
メンバー変数のオプションも避けてください。もしそうなら、なぜですか?ありがとう! – JaeW
onClickListenerへの参照を保持するメンバ変数の場合は、onClickメソッドを実装するために宣言されたクラスが必要になります。したがって、外部クラスのスコープ内で宣言されている場合は静的であることを確認し、外部クラス(内部クラスまたは別のクラスとして宣言されているかどうかに関係なく外部クラスへの参照が必要な場合は、 elseshwereと宣言した)それは弱い参照である。 –