많은 버튼에 대해 OnClickListener 인터페이스를 구현하는 올바른 방법은 무엇입니까


10

내 Android 활동에는 OnClickListener가 필요한 여러 개의 버튼이 있습니다. 나는 다음과 같은 여러 가지 방법을 보았습니다.

  • 활동 클래스에서 인터페이스 구현
  • 인터페이스를 구현하는 별도의 클래스 만들기
  • 각 버튼에 대한 익명의 내부 클래스를 정의합니다.

각 접근법의 많은 예를 보았습니다. 그러나 왜 한 방법이 다른 방법 대신 사용되는지 명확하지 않습니다. 이 접근법들 사이의 차이점은 문체 적입니까?

답변:


6

많은 것들과 마찬가지로 올바른 접근 방식은 특정 버튼에 대해 수행하려는 작업과 활동으로 수행하는 다른 작업에 따라 다릅니다.

활동 클래스는 인터페이스를 구현합니다 .
이것은 당신 만이 리스너가 호출 될 때 실행하는 작업의 한 유형이 좋은 옵션입니다. 이에 대한 예는 여러 필드와 저장 단추가있는 간단한 양식입니다. 실제로 수행해야 할 작업을 결정하기 위해 이벤트 리스너가 이벤트 소스를 확인하지 않도록하는 것이 좋습니다. 나는 이것이 스타일 일이라고 말할 수도 있지만, 청취자 가이 검사를 수행하도록 요구하지 않으면 각 이벤트에 대해 무엇이 호출되는지 정확하게 알 수 있으므로 코드를 더 쉽게 따라갈 수 있다고 생각합니다.

다른 클래스는 인터페이스를 구현합니다 .
위에서 말했듯이 동일한 이벤트를 발생시킬 수있는 여러 항목이있을 때이 옵션을 선호합니다. 위 예제를 확장하면 클릭 리스너가 필요한 지우기 버튼을 추가 할 수 있습니다. 저장 조치를 수행하는 리스너와 명확한 조치를 수행하는 리스너를 작성하십시오. 각 리스너는 해당 조치를 생성하는 컴포넌트에만 추가됩니다.

이 구현에는 관심이있는 경우 활용할 수있는 추가 이점이 있습니다. 다른 클래스가 액티비티 클래스 내부에서 이벤트를 트리거하지 못하게하는 이점이 있습니다. 인터페이스 메소드는 공용이어야하므로 클래스를 참조하는 사람은 누구나 이벤트를 실행할 수 있습니다. 응용 프로그램에서 누가 무엇을 할 수 있는지에 대해 세밀하게 제어하려면 별도의 클래스를 사용하여 활동을 참조하는 사람이 양식을 지우거나 저장하도록 트리거하거나 청취자가 소스를 사용하는 경우 코드를 손상시킬 수는 있지만 잘못된 입력을 처리하지 마십시오).

익명의 내부 클래스는 인터페이스를 구현합니다 .
이것은 실제로 다른 클래스를 구현으로 사용하는 두 번째 옵션을 구성하는 구체적인 방법입니다. 이 옵션은 다른 사람이 클래스의 인스턴스를 만들 수 없으므로 이벤트를 트리거 할 수있는 액세스 권한이있는 사용자를 추가로 제한 할 수 있습니다. 그러나 두 옵션 사이의 더 중요한 요소는 얼마나 많은 작업이 수행되고 있는지입니다. 몇 개의 텍스트 필드를 지우는 것은 간단하고 간단한 작업입니다. 그러나 for를 저장하는 프로세스에는 입력을 검증하고 (수행해야하는) 데이터베이스에 값을 저장하고 일부 저장 후 조치를 트리거하는 작업이 포함됩니다. 이 경우 자체 파일로 별도의 클래스를 작성하면 입력 양식과 데이터 처리가 더 명확하게 구분됩니다. 이것은 내부에 여러 내부 클래스가 중첩 된 더 큰 파일 대신 양식 코드를 유지합니다.


와우, 답변 주셔서 감사합니다. 오버 헤드 측면에서 여러 리스너 클래스를 작성하는 것이 더 비용이 많이 듭니까?
slayton

@ 슬레이튼 : 당신이 무엇을하든 항상 비용이 있습니다. 문제는 "차이가 중요합니까?" 더 많은 객체를 만드는 데 가중치가 있지만 청취자가 실제로 수행 할 작업을 결정하기 위해 소스 목록을 검토해야하는 경우 실행 시간이 길어집니다. 메모리 사용 및 성능이 중요한 경우 코드를 프로파일 링하고 요구 사항에 따라 가장 적합한 것을 결정해야합니다. 그러나 이것이 코드의 병목이 될지 의심 스럽습니다. 다르게 표시 될 때까지 코드를보다 명확하고 체계적으로 결정하십시오.
unholysampler

3

네 번째 방법은 레이아웃에서 onClick 속성을 설정하는 것입니다.

<Button android:onClick="clickHandlerForButtonX" />

액티비티에 해당하는 방법이 있습니다.

public void clickHandlerForButtonX(View v) {
    //Handle Button X here
}

흥미롭게도, 당신이 그렇게 할 수 있다는 것을 몰랐습니다. 이것은 버튼 클릭을 처리하는 Android 전용 메커니즘 인 것 같습니다.
slayton

나는 보통 "Activity class implements interface"와 함께 간다-그렇게하면, 당신은 같은 곳에서 모든 클릭 관련 물건들을 가질 수있다.
orjan

이 특정 방법은 프래그먼트에서 작동하지 않습니다.
Rahul Tiwari
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.