简体   繁体   English

如何在Android中注册多个侦听器?

[英]How to Register Multiple Listeners in Android?

In iOS I can register multiple target+action event handlers for eg a button like this: 在iOS中,我可以为多个按钮注册多个target + action事件处理程序,例如:

@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

I want to achieve something similar in Java/Android, unfortunately this won't work so far as the first listener gets replaced by the second: 我想在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!
      }
    });

  }
}

I appreciate any help & suggestions to achieve the same in Java/Android! 感谢您在Java / Android中实现相同的帮助和建议!

Read about RxJava it is the future :) http://reactivex.io/ 阅读有关RxJava的未来:) http://reactivex.io/

ViewObservable.clicks((Button) getActivity().findViewById(R.id.comment_btn))
            .compose(lifecycleMainObservable().<OnClickEvent>bindLifecycle())
            .subscribe(new Action1<OnClickEvent>() {
                @Override
                public void call(OnClickEvent onClickEvent) {
                    Log.d("Button click", "Button 1 click");
                }
            });

ViewObservable.clicks((Button) getActivity().findViewById(R.id.comment_btn))
            .compose(lifecycleMainObservable().<OnClickEvent>bindLifecycle())
            .subscribe(new Action1<OnClickEvent>() {
                @Override
                public void call(OnClickEvent onClickEvent) {
                    Log.d("Button click", "Button 2 click");
                }
            });

Is it not handled the same way in Android and it is just simpler to create two methods as such: 是不是在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");
   }

As the docs for View.OnClickListener state: 作为View.OnClickListener状态的文档

Register a callback to be invoked when this view is context clicked. 注册上下文单击上下文时要调用的回调。 If the view is not context clickable, it becomes context clickable 如果视图不是上下文可单击的,则它变为上下文可单击的

Multiple callbacks are not implemented by default, but you could implement it yourself. 默认情况下不实现多个回调,但是您可以自己实现。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM