안녕하세요 이번 포스팅은 '데이터 바인딩' 입니다. 개발 문서의 내용이 많아 나누어 수록하도록 하겠습니다. 시작하기 앞서 데이터 바인딩을 사용하실려면 AndroidStudio 버전 1.3 이상이 필요하니 버전에 맞는 AndroidStudio를 사용해주세요.
|
목차
- 사용 방법
- View 사용
- 이벤트 처리
- 클래스 Import
- 클래스 Import
- inclide
- Expression Language(표현 언어)
기본 사용 방법
build.gradle수정하기
gradle(app)에서 databinding에대해 true 값으로 설정하면 됩니다
dataBinding{
enabled = true
}
xml 수정하기
적용 전 소스
데이터 바인딩을 사용하려면 레이아웃 파일의 루트태그에 'layout' 로 추가해야합니다.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/bt_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="시작하기"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp" />
</android.support.constraint.ConstraintLayout>
적용 후 소스
data 요소는 MainActivity를 객체화해서 사용할 수 있도록 합니다. 'activity'의 객체명으로 도트(.)연산자를 통해 클래스의 변수나 메소드에 접근 할 수 있습니다.
이처럼 클래스를 객체화하여 레이아웃에서 위젯의 설정값을 변경함으로써 소스코드를 줄일 수 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="activity"
type="{packageName}.MainActivity" />
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/bt_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{activity.btnString}"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp" />
</android.support.constraint.ConstraintLayout>
</layout>
Java 수정하기
데이터 바인딩은 기존과 다른 방식으로 레이아웃과 연결합니다. 레이아웃의 루트태그를 변경하면 레이아웃 파일의 이름을 기준으로 파스칼 표기법에 따라 바인딩 파일이 생성됩니다. 다음과 같습니다. {레이아웃명}Binding
ActivityMainBinding binding;
public String btnString="시작하기2";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding= DataBindingUtil.setContentView(this,R.layout.activity_main);
binding.setActivity(this);
// setContentView(R.layout.activity_main);
}
저의 xml 명은 activity_main.xml 이므로 ActivityMainBinding으로 생성된 파일에 setContentView를 통해 레이아웃을 연결하고, 'setActivity()'를 통해 레이아웃에서 생성한 변수를 사용할 수 있도록 합니다.
레이아웃 파일을 보시면 변수명을 activity로 선언했기 때문에 setActivity() 입니다. set{변수명}으로, 이 역시 파스칼 표기법을 따릅니다.
바인딩 클래스 이름 변경
{레이아웃명}Binding 으로 생성되는 이름을 커스텀할 수 있습니다.
<data class="Main">
....
</data>
위와 같이 명시하면 바인딩 클래스의 이름은 Main으로 변경됩니다.
View 사용
안드로이드에서 레이아웃에서 생성한 뷰를 엑티비티에서 사용하려면 번거롭고, 뷰가 많아질수록 코드의 수도 늘어납니다. 그래서 나왔던 'butterknife' 라이브러리를 유용하게 사용했었지만 데이터 바인딩은 더 편리하게 해줍니다. 앞서 설정한 레이아웃과 엑티비티로 인해 별도의 선언 없이도 binding 변수를 이용해 사용할 수 있습니다. |
binding.btStart.setText("버튼");
뷰의 이름은 id 속성의 값으로 카멜표기법을 기준으로 변경됩니다. (사용된 레이아웃 id : bt_start )
이벤트 처리
데이터바인딩으로 버튼 클릭등의 이벤트처리도 아래 2가지 방법으로 손쉽게 가능합니다,
차이점 : 메소드 참조 방법은 컴파일시 리스너가 구현되고, 리스너 바인딩 방법은 이벤트 발생시 구현되기 때문에 리스너 바인딩 방법은 리스너가 문제 있을 경우 컴파일시 문제가 없다가 실제 이벤트가 발생했을때 생각하지 못한 에러가 발생할 수 있습니다.
|
기존방법
아래와 같이 클릭리스너를 구현하거나 인터페이스를 이용할 수 있지만, 프로젝트 규모가 커질 수록 비효율 적입니다. |
binding.btStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, WriteMemoActivity.class);
startActivity(intent);
}
});
메소드 참조
Java
버튼등의 위젯을 눌렀을때 실행할 메소드를 만들고 내용을 작성합니다. |
public void nextActivity(View view) {
Intent intent = new Intent(MainActivity.this, WriteMemoActivity.class);
startActivity(intent);
}
접근제한자를 public으로 해야만 xml에서 검색이 가능합니다.
xml
기존에 설정한 activity 변수를 통해 클릭시 작성한 메소드가 실행되도록 설정합니다.
|
<Button
android:id="@+id/bt_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{activity.btnString}"
android:onClick="@{activity::nextActivity}"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp" />
리스너 바인딩
메소드 참조와 비슷하지만 매개변수로 임의의 데이터를 전달할 수 있습니다. |
Java
매개변수로 전달한 임의의 데이터를 바인딩 클래스를 통해 지정합니다. 그리고 리스너 바인딩을 사용해 실행시킬 메소드를 생성합니다.
|
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
binding.setMemo(new MemoData("제목","내용"));
.....
}
public void sendMemoData(MemoData memoData){
Log.e("Wony","title="+memoData.getTitle()+", content="+memoData.getContent());
}
여기서 MemoData는 제목과 내용 필드를 갖고 있는 작은 클래스 입니다.
xml
자바와 동일하게 임의의 데이터를 사용하기 위해 선언합니다.
|
<data>
.....
<variable
name="memo"
type="wony.quickmemo.MemoData"/>
</data>
....
<Button
android:id="@+id/bt_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{activity.btnString}"
android:onClick="@{() -> activity.sendMemoData(memo)}"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp" />
리스너 방식은 람다식으로 표현합니다.
다중 매개변수
다수의 매개변수를 전달하기 위한 방법은 추가로 전달한 매개변수를 선언하고 아래와 같이 작성하면 됩니다.
|
android:onClick="@{() -> activity.sendMemoData(memo,memo2)}"
리턴타입
이용하는 이벤트의 반환값과 메소드의 반환 값이 같아야 합니다.
|
public boolean nextActivity(View view) {
Intent intent = new Intent(MainActivity.this, WriteMemoActivity.class);
startActivity(intent);
return false;
}
onLongClick 이벤트 같은 경우 리턴타입이 boolean 이기 때문에, 메소드 생성시 리턴타입을 boolean으로 생성해야합니다.
1부는 여기서 포스팅을 마치도록 하겠습니다.
참조 : Android Developers Data Binding
※해당 포스팅은 지극히 주관적인 내용으로 저자의 복기 목적으로 작성된 것이고, 내용에대해 수정이나 추가 요청은 언제든 환영합니다.
'안드로이드 > 자바' 카테고리의 다른 글
[안드로이드/Android] 카톡으로 공유하기 (5) | 2018.02.13 |
---|---|
[안드로이드/Android] 데이터 바인딩 사용하기[2/2] (0) | 2018.01.16 |
[안드로이드/Android] 이미지뷰 타입 (0) | 2018.01.09 |
[안드로이드/Android] 권한 체크하기 (6) | 2017.12.17 |
[안드로이드/Android] 네이버 로그인 연동 (0) | 2017.12.12 |