Button
Button은 디바이스 화면(UI)에서 사용자의 이벤트(Click)를 처리하는 가장 기본적인 뷰입니다. 기본적으로 가장 많이 쓰이는 이벤트 처리는 click과 LongClick이 있습니다. 이 이외에도 Focus, Key, Touch 등 다양한 이벤트 처리가 있습니다. MVVM에서 click과 LongClick을 이용한 이벤트 처리 방식을 알아보도록 하겠습니다.
OnClickListener Event
미리 View클래스에 정의된 Listener인터페이스를 이용한 등록방법 입니다. ListenerEvent는 3가지 등록 방식이 있습니다.
- 인터페이스 리스너방식
public class ButtonExampleActivity extends AppCompatActivity
implements View.OnClickListener {
@Override
public void onClick(View v) {
}
}
JAVA
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
[or]
XML
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"/>
인터페이스를 이용하기 때문에 onClick()
메소드를 반드시 정의 해야합니다. XML의 OnClick 속성 역시 여러 뷰에 이벤트 등록이 가능합니다. 또한 OnClick리스너 이벤트를 등록 할 수 있는 모든 뷰에 적용 가능합니다.
public class ButtonExampleViewModel extends BaseObservable
implements View.OnClickListener {
@Override
public void onClick(View v) {
}
}
XML
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{vm::onClick}"/>
MVVM 인터페이스 리스너방식은 기존 방식과 유사하지만 반드시 ViewModel
의 메소드를 참조하는 @{vm::onClick}
형태로 등록해야 합니다.
- 인터페이스 참조 객체
View.OnClickListener onClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
}
};
button1.setOnClickListener(onClick);
button2.setOnClickListener(onClick);
button3.setOnClickListener(onClick);
OnClick리스너 이벤트를 등록 할 수 있는 모든 뷰에 적용 가능합니다.
public View.OnClickListener onClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
}
};
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClickListener="@{vm.onClick}"/>
MVVM 인터페이스 참조 객체에서 참조 객체 생성은 기존 방식과 동일합니다. 다른 점이 있다면 ViewModel
에서 참조된 변수 혹은 메소드는 항상 public
이여야 합니다. 그리고 XML에서 onClick
대신 android:onClickListener
속성을 사용합니다.
인터페이스 리스너와참조 객체의 공통점은 여러 뷰에 Click이벤트를 등록할 수 있다는 점입니다. 다만 다른 뷰의 이벤트를 구별하기 위해서는 v.getId()
메소드를 이용해서 뷰의 id값을 받아 구별하면 됩니다.
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
하나의 뷰에 오직 하나의 이벤트를 등록하고자 할때는 바로 인터페이스 객체를 생성해 적용해 주면 됩니다.
XML onClick속성
이벤트를 정의한 메소드를 바로 뷰의 onClick 속성에 적용하는 방식 입니다.
public void onClick(View v) {
}
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"/>
반드시 지켜야할 사항은 public을 사용하며 반환형및 파라미터 값을 이벤트 리스너 값과 동일하게 적용해야합니다.
public void onClick(View v) {
}
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{vm::onClick}"/>
MVVM OnClick 속성방식은 기존 방식과 동일하지만 ViewModel
의 메소드를 참조하는 @{vm::onClick}
형태로 등록해야 합니다.
기존 onClick방식과 MVVM onClick방식에서 onClick에 적용하는 방법만 다르고 나머지는 모두 동일합니다.
가장 큰 차이점이 있다면 MVVM onClick방식은 컴파일 할때 오류 사실(public, 반환형,파라미터 불일치)을 알려주지만 기존 onClick방식은 이벤트가 발생할때 알 수 있습니다.
OnLongClickListener Event 및 XML onLongClick속성
OnClickListener Event 및 XML OnClick속성에서 OnLongClickListener 과 onLongClick속성을 사용된다는 점과 반환값을 꼭 true로 설정(false설정시 onClick 이벤트가 같이 발생)해야 된다는 점 빼고는 동일합니다.
Congratulations @jeonghamin! You received a personal award!
Click here to view your Board
Do not miss the last post from @steemitboard:
Congratulations @jeonghamin! You received a personal award!
You can view your badges on your Steem Board and compare to others on the Steem Ranking
Vote for @Steemitboard as a witness to get one more award and increased upvotes!