본문 바로가기

안드로이드/자바

[안드로이드/Android] 데이터 바인딩 사용하기[1/2]

반응형

 

 

안녕하세요 이번 포스팅은 '데이터 바인딩' 입니다. 

개발 문서의 내용이 많아 나누어 수록하도록 하겠습니다. 시작하기 앞서 데이터 바인딩을 사용하실려면 AndroidStudio 버전 1.3 이상이 필요하니 버전에 맞는 AndroidStudio를 사용해주세요.

 

목차

데이터 바인딩 사용하기[1/2]

  • 사용 방법
  • 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 

 

 

 

 

 

해당 포스팅은 지극히 주관적인 내용으로 저자의 복기 목적으로 작성된 것이고, 내용에대해 수정이나 추가 요청은 언제든 환영합니다. 

 

 

 

 

 

반응형