이전에 비슷한 단어로 된 질문이 있었지만 이것은 다릅니다. 나는 안드로이드 앱을 개발하는 데 익숙하지 않으며 android:onclick=""
XML 속성과 setOnClickListener
메서드 의 차이점에 대해 세 가지 질문이 있습니다.
-
둘의 차이점은 무엇입니까? 컴파일 타임이나 런타임 또는 둘 다에서 발견 된 두 구현의 차이점이 있습니까?
-
어떤 사용 사례가 어떤 구현에 유리합니까?
-
Android에서 조각을 사용하면 구현 선택에 어떤 차이가 있습니까?
답변
OnClickListener와 OnClick의 차이점 :
- OnClickListener는 구현해야하는 인터페이스이며 Java 코드에서보기로 설정할 수 있습니다.
- OnClickListener는 누군가가 실제로 클릭하기를 기다리는 것이고, onclick은 누군가가 클릭 할 때 일어나는 일을 결정합니다.
- 최근에 android는 android : onclick이라는 뷰에 xml 속성을 추가했습니다. 이는 인터페이스를 구현할 필요없이 뷰의 활동에서 직접 클릭을 처리하는 데 사용할 수 있습니다.
- 필요한 경우 하나의 리스너 구현을 다른 구현으로 쉽게 바꿀 수 있습니다.
- OnClickListener를 사용하면 이벤트를 트리거하는보기에서 클릭 이벤트의 동작 / 동작을 분리 할 수 있습니다. 간단한 경우에는 그렇게 큰 문제가 아니지만 복잡한 이벤트 처리의 경우 코드의 가독성과 유지 관리 용이성을 의미 할 수 있습니다.
- OnClickListener는 인터페이스이기 때문에이를 구현하는 클래스는 이벤트를 처리하는 데 필요한 인스턴스 변수와 메서드를 결정하는 데 유연성이 있습니다. 다시 말하지만, 이것은 단순한 경우에는 큰 문제가 아니지만 복잡한 경우에는 이벤트 처리와 관련된 변수 / 메서드를 이벤트를 트리거하는 뷰의 코드와 혼합 할 필요가 없습니다.
- XML 레이아웃의 함수 바인딩이있는 onClick은 onClick과 호출 할 함수 간의 바인딩입니다. onClick이 작동하려면 함수에 하나의 인수 (View)가 있어야합니다.
둘 다 동일한 방식으로 작동합니다. 하나는 Java 코드를 통해 설정되고 다른 하나는 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에는 오버 헤드가 없습니다.
한정:
android : onClick은 API 레벨 4 이상이므로 1.6 미만을 대상으로하는 경우 사용할 수 없습니다.
답변
나는 아무도 이것에 대해 이야기하지 않았다는 것에 충격을 받았다. 그러나 android:onClick
XML이 클릭을 처리하는 편리한 방법 인 것처럼 보이지만, setOnClickListener
구현은onClickListener
. 실제로 view 속성 clickable
을 true로 설정합니다.
대부분의 Android 구현에서는 문제가되지 않을 수 있지만 전화 생성자에 따르면 버튼은 항상 기본적으로 clickable = true이지만 일부 전화 모델의 다른 생성자는 Button이 아닌 뷰에서 기본 clickable = false를 가질 수 있습니다.
따라서 XML을 설정하는 것만으로는 충분하지 않기 때문에 android:clickable="true"
버튼이 아닌 추가 에 대해 항상 생각해야합니다 . 기본값이 클릭 가능 = true 인 장치가 있고이 XML 속성을 입력하는 것을 한 번도 잊어 버린 경우에는 눈치 채지 못할 것입니다. 런타임에 문제가 발생하지만 고객의 손에있을 때 시장에 대한 피드백을 얻을 수 있습니다!
또한 proguard가 XML 속성 및 클래스 메서드를 난독 화하고 이름을 바꾸는 방법을 확신 할 수 없으므로 언젠가는 버그가 발생하지 않을 100 % 안전하지 않습니다.
따라서 문제가 발생하지 않고 그것에 대해 생각하지 않으려면 setOnClickListener
주석과 함께 ButterKnife와 같은 라이브러리 를 사용하는 것이 좋습니다.@OnClick(R.id.button)
답변
간단히:
당신이있는 경우 android:onClick = "someMethod"
XML로 , 그것은을 찾습니다 public void someMethod
액티비티 클래스입니다. 귀하의 활동에서OnClickListener
바로 호출 되며 특정 View
. 예를 들어 someButton.setOnClickListener
아래 코드에서someButton
에는를 누를 이 나와 있습니다.
도움이되기를 바랍니다 🙂
답변
앞서 말했듯이 둘 다 이벤트 (이 경우 ‘클릭’이벤트)에 대한 응답으로 로직을 추가하는 방법입니다.
HTML / JavaScript 세계 에서처럼 로직과 프리젠 테이션을 분리합니다. 프리젠 테이션을 위해 XML을 남겨두고 코드를 통해 이벤트 리스너를 추가합니다.
답변
한 가지 방법 만 사용하는 버튼이 여러 개인 경우 Java에서 수행하는 것이 좋습니다. 그러나 하나의 특정 메서드가있는 버튼이있는 경우 XML의 onClick이 더 좋습니다.
답변
예를 들어 런타임에 Button을 인스턴스화하거나 Fragment 하위 클래스에서 클릭 동작을 선언해야하는 경우와 같이 적절한 이유가없는 한 항상 android : onClick 속성을 사용하는 것이 더 편리합니다.
답변
.NET Framework를 프로그래밍 방식으로 설정해야하는 몇 가지 이유가 있습니다 OnClickListener
. 첫 번째는 앱이 실행되는 동안 버튼의 동작을 변경하려는 경우입니다. 버튼을 다른 방법으로 완전히 가리킬 수도 있고 OnClickListener
아무것도하지 않는를 설정하여 버튼을 비활성화 할 수도 있습니다.
onClick
속성을 사용하여 리스너를 정의 하면보기는 호스트 활동에서만 해당 이름을 가진 메소드를 찾습니다. 프로그래밍 방식으로를 설정하면 OnClickListener
호스트 활동이 아닌 다른 곳에서 버튼의 동작을 제어 할 수 있습니다. Fragments
기본적으로 미니 활동 인를 사용할 때 이는 매우 관련성 이 높아져서 자체 라이프 사이클을 사용하여 재사용 가능한 뷰 컬렉션을 빌드 한 다음 활동으로 조합 할 수 있습니다. 프래그먼트 OnClickListeners
는 활동이 아니기 때문에 버튼을 제어하는 데 항상 사용해야 하며 onClick에 정의 된 리스너를 검색하지 않습니다.