2016-01-05 59 views
1

在iOS中,我可以註冊多個目標+動作事件處理程序,例如像這樣的按鈕:如何在Android中註冊多個監聽器?

@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中實現相同!

+0

你爲什麼要這麼做?你想通過這個實現什麼? –

+0

我正在開發一個Android SDK,它需要在運行時向現有UI元素添加行爲。例如。發送點擊事件到我們的服務器... –

回答

1

難道不同樣的方式處理在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"); 
    } 

由於docsView.OnClickListener狀態:

註冊一個回調是當此視圖被上下文單擊時調用。如果視圖不是上下文可點擊的,則它變爲上下文可點擊的

多個回調默認情況下不會實現,但您可以自己實現。

+0

好主意,讓我們說Button已經有一個OnClickListener,你知道任何方式來在運行時獲得該監聽器嗎? –

+0

@BenMarten沒有相應的getOnClickListener,所以對於View類是不可能的 –

+0

我找到了這個答案,似乎與反射它是可能的。我會嘗試這條路線。感謝您的答案和幫助:http://stackoverflow.com/a/14993764/2302437 –

3

閱讀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"); 
       } 
      }); 
+0

這一行的目的是什麼'compose(lifecycleMainObservable()。 bindLifecycle())' – menawi

+0

你可以讀一些關於它的東西這裏https://github.com/trello/RxLifecycle。它還可以防止NPE在視圖被釋放後觀察到放射值,並且你試圖在訂閱動作中設置一些值 – Rzodkiewka