2009-12-29 2 views
11

표시되는 대부분의 샘플은 button.setOnClickListener()와 같은 호출에서 익명 메소드를 사용하는 것으로 보입니다. 대신, 저는 작업중인 Activity 클래스에 정의 된 메서드를 전달하고 싶습니다. C#에서 다음 이벤트 처리기 배선과 관련된 Java/Android는 무엇입니까?안드로이드 - button.setOnClickListener()에서 명명 된 메서드를 설정하는 방법

private void OnMyButtonClick(object sender, EventArgs ea) 
{ 
} 

기본적으로, 나는 여러 버튼의 클릭 이벤트를 처리하는 익명이 아닌 방법을 다시 사용할 수 있도록 :

Button myButton = new Button(); 
myButton.Click += this.OnMyButtonClick; 

.

답변

14

Roman Nurik의 답변이 거의 정확합니다. View.OnClickListener()는 실제로 인터페이스입니다. 따라서 Activity가 OnClickListener를 구현하면 버튼 클릭 핸들러로 설정할 수 있습니다.

public class Main extends Activity implements OnClickListener { 

     public void onCreate() { 
      button.setOnClickListener(this); 
      button2.setOnClickListener(this); 
     } 

     public void onClick(View v) { 
      //Handle based on which view was clicked. 
     } 
} 

닷넷에서와 같은 대표가 없습니다, 그래서 당신은 인터페이스를 기반으로 기능을 사용하여 붙어 있습니다. 닷넷에서는 델리게이트를 사용하여 다른 기능을 지정할 수 있습니다.

+0

나는 자바가 델리게이트 타입을 가지고 있지 않다는 것을 깨닫지 못했다. –

+1

사실 나는이 기사를 실제로 보았습니다 (실제로는 오래된 기사입니다). 대리인을 사용하지 말라는 그들의 거부에 대한 다소 흥미로운 의견. .Net에서 대리인을 사용하는 것을 좋아했기 때문에 내가 동의하는지 모르겠다. http://java.sun.com/docs/white/delegates.html – GrkEngineer

1

메소드의 서명이 있어야합니다 ...

public void onMyButtonClick(View view){ 

} 

동적 버튼을 사용하지 않는 경우, 당신은 디자이너에게 "onMyButtonClick"에서 "온 클릭"이벤트를 설정할 수 있습니다. 이것이 화면의 정적 버튼에 대한 작업입니다. 내가 C#과 연관시키는 것이 더 쉬웠다.

+0

Android 1.6, IIRC의 새로운 기능입니다. – CommonsWare

8

View.setOnClickListener의 인수는, 사용 사례를 들어, 변수이 내부 클래스의 인스턴스를 유지하고 그를에 전달할 수 있습니다 ..합니다 (View 클래스의 내부 클래스) 클래스 View.OnClickListener의 인스턴스 여야합니다 같은 : 여러 서브 루틴/방법에서이 리스너가 필요한 경우

View.OnClickListener clickListener = new OnClickListener() { 
    public void onClick(View v) { 
     // do something here 
    } 
}; 

myButton.setOnClickListener(clickListener); 
myButton2.setOnClickListener(clickListener); 

, 당신은 당신의 활동 클래스의 멤버 변수로 저장할 수 있습니다.

관련 문제