[android] MVVM – 2. Button

버튼을 클릭했을 때도 액티비티가 아닌 뷰모델에서 다 처리할 수 있다. 여기에는 간단한 방법만 적을 것이고, 자세한 방법은 https://developer.android.com/topic/libraries/data-binding/index.html?hl=ko에 나와있다.

onClick처럼 이름이 정해져있는? 것들은 다르게 쓰면 안된다. 다른 컴포넌트들은 코드에서 setOn~Listener에서 set을 빼고 O를 소문자 o로 바꿔서 쓰면 되더라.

만약 오타가 나면 어디서 틀렸는 지 한 번에 찾기 힘든 컴파일 에러가 나서 조금 불편하다. 그러니 한 번에 너무 많은 걸 작업하지 말고 틈틈이 컴파일 해가면서 작업하면 좋을 것 같다. 안드로이드 스튜디오도 얼른 데이터 바인딩을 더 잘 지원했으면 좋겠다.

 

<?xml version="1.0" encoding="utf-8"?>
<layout>

  <data>

    <variable
      name="model"
      type="kr.susemi99.testmvvm.view_models.MainViewModel"/>
  </data>

  <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@{model.helloText}"
      tools:text="Hello World!"/>

    <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:onClick="@{()-> model.showCurrentTime()}"
      android:text="current time1"/>

    <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:onClick="@{model.currentTime2ClickListener}"
      android:text="current time2"/>
  </LinearLayout>
</layout>

버튼 두 개를 추가했다. 하나는 뷰모델의 메소드를 호출하고, 하나는 클릭 리스너를 연결 시켰다.

 

 

public class MainViewModel implements BaseViewModel {
  public final ObservableField<String> helloText = new ObservableField<>();

  @Override
  public void onCreate() {
    helloText.set("hello!");
  }

  @Override
  public void onResume() {}

  @Override
  public void onPause() {}

  @Override
  public void onDestroy() {}

  public void showCurrentTime() {
    helloText.set(String.valueOf(System.currentTimeMillis()));
  }

  public View.OnClickListener currentTime2ClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      showCurrentTime();
    }
  };
}

메소드를 추가해도 되고, 리스너를 만들어도 된다. 리스너는 람다식으로 바꾸면 한 줄로 만들 수도 있으니 메소드를 연결하는 것과 큰 차이는 없지 싶다.