[Andoird] 6. MVVM에 Button사용하기!

in #kr6 years ago

android_title_image.jpg

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 이벤트가 같이 발생)해야 된다는 점 빼고는 동일합니다.

Sort:  

Congratulations @jeonghamin! You received a personal award!

1 Year on Steemit

Click here to view your Board

Do not miss the last post from @steemitboard:

SteemWhales has officially moved to SteemitBoard Ranking
SteemitBoard - Witness Update

Support SteemitBoard's project! Vote for its witness and get one more award!

Congratulations @jeonghamin! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 2 years!

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!