Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android中注册多个侦听器?_Java_Android_Onclicklistener - Fatal编程技术网

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

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]];

在iOS中,我可以为以下按钮注册多个目标+操作事件处理程序:

@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