본문 바로가기

개발/android

DataBindng (1)

반응형

https://developer.android.com/topic/libraries/data-binding/index.html?hl=ko


1. app.gradle 에 


android {
   
....
    dataBinding
{
        enabled
= true
   
}
}


를 추가한다 



2. 아래와 같은 형태의 xml 레이아웃을 가진다.

먼저 layout으로 감싼 이후, data에 있는 변수를 내부에서 처리할 수 있다.

레이아웃 안에서 수식은   @{} 으로  처리 된다 


<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   
<data>
       
<variable name="user" type="com.example.User"/>
   
</data>
   
<LinearLayout
       
android:orientation="vertical"
       
android:layout_width="match_parent"
       
android:layout_height="match_parent">
       
<TextView android:layout_width="wrap_content"
           
android:layout_height="wrap_content"
           
android:text="@{user.firstName}"/>
       
<TextView android:layout_width="wrap_content"
           
android:layout_height="wrap_content"
           
android:text="@{user.lastName}"/>
   
</LinearLayout>
</layout>


3. @{user.firstName}  으로 매칭시, class user의 firstName, 또는 getFirstName()으로 매칭된다


4. 데이터 바인딩은 레이아웃 파일의 이름을 기준으로 main_activity.xml --> MainActivityBinding으로 생성 된다.

@Override
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
   
MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
   
User user = new User("Test", "User");
   binding
.setUser(user);
}

    위와 같은 형태로 user를 xml에 binding 할 수 있다


5. 액티비티에서는 바인딩을

MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());

와 같이 이용할 수도 있다


6. 리스트뷰 어댑터, 리사이클러뷰 어댑터에서는


ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
와 같이 이용 할 수도 있다


7. 이벤트 처리


기존 View view = findViewById(R.id.viewName); 

view.setOnClickListener(new XX or this...); 등과 같이 사용했던 이벤트를 처리하는 방법으로는 

두가지가 있는데

하나는 메서드 참조,

하나는 리스너 바인딩 이다


메서드 참조는 만약 MyHandlers 라는 클래스가 있다면 

public class MyHandlers {
   
public void onClickFriend(View view) { ... }
}

XML의 data 부에  아래와 같이 handler 변수를 추가하고 

<variable name="handlers" type="com.example.MyHandlers"/>

XML의 view단에 

android:onClick="@{handlers::onClickFriend}"

선언한 handler의 onClickFriend를 매핑한다 

메서드 참조시에는 메서드의 매개변수와 이벤트 리스너의 매개변수가 같아야 한다 



리스너 바인딩은 메서드 참조와 비슷하나, 임의의 데이터 바인딩 을 사용할 수 있다 

리스너 바인딩시에는 매개변수와는 상관없이 리턴값만 리스너의 리턴값과 같아도 상관없다


Presenter 라는 클래스를 리스너 바인딩으로 처리한다면 

public class Presenter {
   
public void onSaveClick(Task task){}
}

XML의 data부에 

<variable name="presenter" type="com.android.example.Presenter" />

presenter를 선언하고 


View단에 

  android:onClick="@{() -> presenter.onSaveClick(task)}"

이와 같은 람다식으로 처리할 수 있다( 식에서 콜벡에 사용할 리스너를 자동 생성한다)

리스너 바인딩 시, 모든 매개변수를 사용하거나, 모든 매개변수를 무시하거나 둘 중 하나를 선택해서 사용한다


(매개변수 사용)

 android:onClick="@{(view) -> presenter.onSaveClick(task)}"


(onSaveClick이 View, Task를 가진다면)

public class Presenter {
   
public void onSaveClick(View view, Task task){}
}
android:onClick="@{(theView) -> presenter.onSaveClick(theView, task)}"

이와 같이 현재(thisView)뷰를 onSaveClick에 매칭시킬 수도 있고



CheckBox의 CheckedChanged시, completedChanged를 동작시킬수도 있다 

public class Presenter {
   
public void onCompletedChanged(Task task, boolean completed){}
}
  <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content"
       
android:onCheckedChanged="@{(cb, isChecked) -> presenter.completeChanged(task, isChecked)}" />



null 객체로 식 계산이 불가능 한 상황이 생길 수 있다면 

android:onClick="@{(v) -> v.isVisible() ? doSomething() : void}"

null, 0 , false등을 조건자 처리해준다 



반응형