버튼을 클릭했을 때도 액티비티가 아닌 뷰모델에서 다 처리할 수 있다. 여기에는 간단한 방법만 적을 것이고, 자세한 방법은 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(); } }; }
메소드를 추가해도 되고, 리스너를 만들어도 된다. 리스너는 람다식으로 바꾸면 한 줄로 만들 수도 있으니 메소드를 연결하는 것과 큰 차이는 없지 싶다.