Java 如何在Android中注册多个侦听器?
在iOS中,我可以为以下按钮注册多个目标+操作事件处理程序:Java 如何在Android中注册多个侦听器?,java,android,onclicklistener,Java,Android,Onclicklistener,在iOS中,我可以为以下按钮注册多个目标+操作事件处理程序: @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(20, 40, 300, 40)]; [button setBackgroundColor:[UIColor blueColor]];
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(20, 40, 300, 40)];
[button setBackgroundColor:[UIColor blueColor]];
[button setTitle:@"Click Me!" forState:UIControlStateNormal];
[button addTarget:self action:@selector(handler1) forControlEvents:UIControlEventTouchUpInside];
[button addTarget:self action:@selector(handler2) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
- (void)handler1 {
NSLog(@"Click handler 1"); // FIRES!
}
- (void)handler2 {
NSLog(@"Click handler 2"); // FIRES!
}
@end
我想在Java/Android中实现类似的功能,不幸的是,如果第一个侦听器被第二个侦听器替换,那么这将无法实现:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setText("Click Me!");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Test", "Click handler 1"); // DOES NOT FIRE!
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Test", "Click handler 2"); // FIRES!
}
});
}
}
我非常感谢您的帮助和建议,以便在Java/Android中实现同样的功能 它在Android中的处理方式不一样吗?创建两个这样的方法更简单:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
method1();
method2();
}
});
private void method1(){
Log.d("Test", "Click handler 1");
}
private void method2(){
Log.d("Test", "Click handler 2");
}
对于视图.OnClickListener
状态:
注册在上下文单击此视图时要调用的回调。如果视图不可在上下文中单击,则它将变为可在上下文中单击
默认情况下不会实现多个回调,但您可以自己实现。在Android中处理方式是否不同,创建两种方法更简单:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
method1();
method2();
}
});
private void method1(){
Log.d("Test", "Click handler 1");
}
private void method2(){
Log.d("Test", "Click handler 2");
}
对于视图.OnClickListener
状态:
注册在上下文单击此视图时要调用的回调。如果视图不可在上下文中单击,则它将变为可在上下文中单击
默认情况下不会实现多个回调,但您可以自己实现。阅读关于RxJava的文章,它是未来:)
ViewObservable.clicks((按钮)getActivity().findViewById(R.id.comment_btn))
.compose(lifecycleMainObservable().bindLifecycle())
.订阅(新操作1(){
@凌驾
公共作废调用(OnClickEvent OnClickEvent){
Log.d(“按钮点击”、“按钮1点击”);
}
});
ViewObservable.clicks((按钮)getActivity().findViewById(R.id.comment_btn))
.compose(lifecycleMainObservable().bindLifecycle())
.订阅(新操作1(){
@凌驾
公共作废调用(OnClickEvent OnClickEvent){
Log.d(“按钮点击”、“按钮2点击”);
}
});
阅读关于RxJava的文章,它是未来:)
ViewObservable.clicks((按钮)getActivity().findViewById(R.id.comment_btn))
.compose(lifecycleMainObservable().bindLifecycle())
.订阅(新操作1(){
@凌驾
公共作废调用(OnClickEvent OnClickEvent){
Log.d(“按钮点击”、“按钮1点击”);
}
});
ViewObservable.clicks((按钮)getActivity().findViewById(R.id.comment_btn))
.compose(lifecycleMainObservable().bindLifecycle())
.订阅(新操作1(){
@凌驾
公共作废调用(OnClickEvent OnClickEvent){
Log.d(“按钮点击”、“按钮2点击”);
}
});
为什么要这样做?我正在开发一个Android SDK,它需要在运行时向现有的UI元素添加行为。例如,要将单击事件发送到我们的服务器…您为什么要这样做?我正在开发一个Android SDK,它需要在运行时向现有的UI元素添加行为。例如,要将单击事件发送到我们的服务器…好主意,假设按钮已经有一个OnClickListener,您知道在运行时获取该侦听器的任何方法吗?@BenMarten没有等效的getOnClickListener
,因此使用视图类是不可能的。我找到了这个答案,似乎通过反射是可能的。我会试试这条路线。感谢您的回答和帮助:好主意,假设按钮已经有一个OnClickListener,您知道在运行时获取该侦听器的任何方法吗?@BenMarten没有等效的getOnClickListener
,因此在视图类中不可能找到此答案,通过反射似乎是可能的。我会试试这条路线。感谢您的回答和帮助:这一行的目的是什么。当observable在视图被破坏后发出值,并且您试图在subscribe Action中设置一些值时,它还可以防止视图上的NPE。这一行的目的是什么compose(lifecycleMainObservable().bindLifecycle())
您可以在这里阅读有关它的内容。当视图被破坏并且您试图在订阅操作中设置一些值时,observable发出值时,它还可以防止视图上的NPE