2014-01-23 4 views
57

이전에 비슷한 단어가있는 질문이 있지만 사실이 다릅니다. 나는 안드로이드 애플 리케이션 개발에 꽤 새로운데, android:onclick="" XML 속성과 setOnClickListener 메소드 사이의 차이점에 대해 세 가지 질문이 있습니다.XML과 OnClickListener의 Android onClick

  1. 둘 사이의 차이점은 무엇입니까? 컴파일 시간 또는 런타임 또는 두 가지 모두에서 발견 된 두 구현의 차이점은 무엇입니까?

  2. 어떤 구현 사례가 어떤 구현에 유리합니까?

  3. Android에서 조각을 사용하면 구현 선택에 어떤 차이가 있습니까? 의 OnClick 대 OnClickListener를 사이

+1

와 ButterKnife처럼 setOnClickListener 또는 라이브러리를 사용하는 것이 좋습니다 : 당신은 조심해야 당신으로 onclick' XML을'사용하는 경우 모든 클래스가 해당 메소드를 구현하는지 확인해야합니다. 이것은 레이아웃을 두 번 이상 사용한다고 가정합니다. 그러나 메소드를 구현 한 모든 클래스에 메소드가 있는지 확인하기 위해 Java 인터페이스가 있다면 걱정할 필요가 없습니다. – Uxonith

+0

자바 인터페이스가 없으므로 OnClickListener를 확장하거나 구현하는 것과 거의 같습니다. – KG6ZVP

+0

나는 이것으로 이전을 검토 한 결과 내가 선호 그것보다 조금 더 있다고 생각하지만, 나는 동안이었다 나는 훨씬 더 말할 수 없습니다 죄송합니다. 나는 편리 할 때'android : onclick'을 좋아하지만 때로는 문제를 일으키고 그 중 하나를 기억할 수 없다는 것을 안다. :) – Uxonith

답변

93

차이 :

  • OnClickListener를 당신이 구현해야하고 자바 코드에서보기로 를 설정할 수있는 인터페이스입니다.
  • OnClickListener는 누군가 을 실제로 클릭하기를 기다리는 것이며 onclick은 누군가 이 클릭 할 때 어떤 일이 발생하는지 결정합니다.
  • 최근에 안드로이드는 android : onclick이라는이라는 뷰에 xml 속성을 추가하여 어떤 인터페이스도 구현할 필요없이보기의 작업 에서 직접 클릭을 처리하는 데 사용할 수 있습니다.
  • 필요한 경우 하나의 수신기 구현을 다른 수신기와 쉽게 바꿀 수 있습니다.
  • OnClickListener를 사용하면 click 이벤트의 동작/동작을 이벤트를 트리거하는 뷰와 구분할 수 있습니다. 간단한 이벤트의 경우 복잡한 이벤트 처리를 위해 큰 문제는 아니지만 코드의 가독성과 유지 보수성이 향상 될 수 있습니다.
  • OnClickListener는 인터페이스이므로 구현하는 클래스는 인스턴스 변수 및 메서드를 결정할 때 유연성이 있습니다. 이벤트를 처리하기 위해 필요한 것입니다. 다시 말하지만 단순한 경우 큰 문제는 아니지만 복잡한 경우에는 이벤트 처리와 관련된 변수/메서드를 이벤트를 트리거하는보기의 코드와 혼합하지 않아도됩니다.
  • XML 레이아웃에서 onClick with function 바인딩은 onClick과 호출 할 함수 사이의 바인딩입니다. 이 함수는 onClick이 작동하기 위해서는 하나의 인수 (View)가 있어야합니다.

두 가지 모두 같은 방식으로 작동하며, 자바 코드와 xml 코드를 통해 설정됩니다.

setOnClickListener 코드 구현 :

Button btn = (Button) findViewById(R.id.mybutton); 

btn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    myFancyMethod(v); 
    } 
}); 

// some more code 

public void myFancyMethod(View v) { 
    // does something very interesting 
} 

XML 구현 :

<?xml version="1.0" encoding="utf-8"?> 
<!-- layout elements --> 
<Button android:id="@+id/mybutton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Click me!" 
    android:onClick="myFancyMethod" /> 
<!-- even more layout elements --> 

성능 :

모두 성능이 동일합니다. Xml은 컴파일하는 동안 이진 코드로 미리 파싱됩니다. 따라서 XML에는 오버 헤드가 없습니다.

제한 :

안드로이드 : 온 클릭은 이후 API 레벨 4, 그래서 당신이 < 1.6을 대상으로하는 경우, 당신은 사용할 수 없습니다.

+0

'컴파일하는 동안 Xml은 바이너리 코드로 미리 파싱됩니다. '이 문장은 정확히 무엇을 의미합니까? 메신저 파일에 android : onClick이있는 apk의 dexcode를 보았지만 명시 적으로 ** 청취자를 설정 한 코드를 찾지 못했습니다 ** – VicX

+0

멋진 설명. +1 –

+0

@ ZiaUrRahman 감사합니다. 그게 내 기쁨이야. – Jeba

10

간단히 :

당신은 XML에서 android:onClick = "someMethod", 그것은 액티비티 클래스의 public void someMethod을 찾습니다있는 경우. OnClickListener 액티비티에서 오른쪽 이라고하며 일부는 View과 연결되어 있습니다. 예를 들어 someButton.setOnClickListener과 아래 코드에서 someButton을 눌렀을 때 수행해야 할 작업이 있습니다.

은 도움이 :)

0

으로 전에 말했듯이 희망 : 그들은 모두이 경우, 이벤트에 대한 응답으로 '클릭'이벤트를 논리를 추가하는 방법입니다.

우리는 HTML/JavaScript 세계에서와 마찬가지로 로직과 프리젠 테이션을 구분할 것입니다. 프리젠 테이션을 위해 XML을 그대로두고 코드를 사용하여 이벤트 리스너를 추가하십시오.

0

하나의 메소드 만 사용하는 단추가 여러 개있는 경우 Java에서 수행하는 것이 좋습니다. 그러나 하나의 특정 메서드가있는 단추가 있으면 onClick in XML이 더 좋을 것입니다.

의 OnClick : 당신은 당신의 손가락으로 버튼을 클릭하면

0

나는 그들 사이의 주요 차이점은 생각합니다.

OnClickListner : 다양한 코드로 구현되는 더 넓은 선택 일 수 있습니다.

예를 들어 url "ymail.com"을 입력하면 yahoo는 브라우저에서 사용자 이름과 암호를 찾고 클릭 상태 단추를 사용하여 메일을 엽니 다. 이 액션은 onClickListener에서만 구현되어야합니다.

이것은 제 생각입니다!

8
동적 API 수준에서 팽창되어 온 클릭 중첩 된 레이아웃 요소가 작동하지 않습니다

XML 19

+6

이 코멘트 –

0

그것은 항상 안드로이드를 사용하는 것이 더 편리합니다 : 당신이 좋은 이유는 아니다, 예를 들어, 당신이 만약이 없다면 온 클릭 속성 런타임에 Button을 인스턴스화하거나 Fragment 하위 클래스에서 클릭 비헤이비어를 선언해야합니다.

+1

에 나는 거의 안드로이드를 구현하는 다른 사람의 코드를 본 적이있다한다. 그것은 setOnClickListener의 모든 가능성을 거의 가지고 있지 않기 때문에 거의 항상 내 의견으로는 setOnClickListener 만 사용합니다. – Christian

7

XML이 클릭을 처리하는 편리한 방법 인 것처럼 보이지만, setOnClickListener 구현은 onClickListener을 추가하는 것 외에 추가 작업을 수행하지만주의를 기울이지는 않습니다. 사실 뷰 속성 clickable을 true로 설정합니다.

휴대 전화 생성자에 따르면 대부분의 Android 구현에서는 문제가되지 않지만 button은 항상 clickable = true이지만 일부 휴대 전화 모델의 다른 생성자는 버튼이 아닌보기에서 기본 clickable = false를 가질 수 있습니다.

XML을 설정하는 것만으로는 충분하지 않기 때문에 언제든지 android:clickable="true"을 비 버튼에 추가해야한다고 생각해야합니다. 기본값 인 clickable = true이고이 XML 속성을 한 번만 입력하는 것을 잊어 버린 경우, 당신은 런타임에 문제를 알아 채지 못할 것이지만 그것이 고객의 손에있을 때 시장에 대한 피드백을 얻을 것입니다!

또한, 우리는 난독 화는 당황하고 XML 속성과 클래스 메소드의 이름을 변경, 그래서 그들은 버그 어느 날이 결코 것을 100 % 안전한 방법에 대해 확신 할 수 없다.

그래서 당신은 문제가 결코 그것에 대해 생각하고 싶지 않을 경우, 그것은 # 2의 주석 @OnClick(R.id.button)