본문 바로가기

안드로이드/자바

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

반응형

 

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

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




목차

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

  • 사용 방법
  • View 사용
  • 이벤트 처리
  • 클래스 Import
  • inclide
  • Expression Language(표현 언어)




Import

 

import를 통해 더 많은 작업을 할 수 있습니다.



xml 수정

 

먼저 MemoData.Class에 isComplete 의 boolean변수를 새로 선언합니다. 그리고 memo 객체의 값에 따라 버튼을 사라지거나 생기게 할 수 있습니다.


<?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>

<import
type="android.view.View"/>
...
</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}"
android:onClick="@{() -> activity.sendMemoData(memo,memo2)}"
android:visibility="@{memo.isComplete ? View.VISIBLE : View.GONE}"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp" />
</android.support.constraint.ConstraintLayout>
</layout>

삼항연산자를 사용하여 코드로 따로 처리하지 않아도 데이터값에 따라 변경됩니다.

 현재 스튜디오(3.0)은 자동완성 기능이 작동하지 않지만 앱 실행시 문제가 발생하지 않고 정상적으로 작동합니다.


별칭

 

import된 클래스의 이름 중복으로 인한 충돌 방지로 별칭을 지정할 수 있습니다.


type="wony.quickmemo.View"
alias="secondView"/>

생성한 View는 view.View와 겹치므로 별칭 'secondView'로 사용 가능합니다.



정적 필드와 메소드 가져오기

 

클래스에 선언된 정적 필드의 값이나 정적 메소드의 반환값을 가져와 뷰의 속성을 설정할 수 있습니다.


Java

 

CommUtils 클래스의 정적 필드 APP_NAME을 선언합니다.


public class CommUtils {

public static final String APP_NAME="퀵메모";
}


xml

 

사용할 클래스를 import하고 뷰의 속성을 설정합니다.


<?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>

<import
type="wony.quickmemo.CommUtils"/>
.....

</data>

<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
android:id="@+id/bt_start"

........
android:text="@{CommUtils.APP_NAME}" />
</android.support.constraint.ConstraintLayout>
</layout>

해당 버튼의 텍스트는 "퀵메모" 가 된걸 확인할 수 있습니다.




include

 

데이터 바인딩을 사용하여 만든 레이아웃을 include 할때도 유용하게 사용할 수 있습니다.



activity_main.xml

 

현재 레이아웃에 추가해서 사용할 xml파일을 추가합니다.


<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:bind="http://schemas.android.com/apk/res-auto">

<data>

       ......
<variable
name="memo"
type="wony.quickmemo.MemoData"/>

</data>

<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<include layout="@layout/list_memo"
bind:memo="@{memo}"/>

......
</LinearLayout>
</layout>

bind를 통해 list_memo.xml에 선언된 변수에 현재 레이아웃에 있는 변수를 전달합니다.


list_memo.xml

 

include하기위해 생성한 레이아웃 입니다.


<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

<data>

<variable
name="memo"
type="wony.quickmemo.MemoData" />
</data>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{memo.title}" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{memo.content}" />

</LinearLayout>

</layout>

memo 객체가 null 일 경우 각 필드는 기본값인 null이 할당됩니다.


Java

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);
binding.setMemo(new MemoData("제목","내용"));
.......


}

setMemo를 통해 전달한 클래스의 값으로 인해 include 속 두개의 textview는 각 각 '제목' , '내용' 의 텍스트 속성을 갖게 됩니다.




Expression Language(표현 언어)


지원 연산

 

값을 나타내도록 도와주는 표현 언어로 다음과 같이 자바와 유사하게 지원합니다. 


  • 수 연산  +, -, /, *, %
  • 문자열 연결 : +
  • 논리 &&, ||
  • 이항 &.|.^
  • 단항 +, -, !, ~
  • 비교 ==, >, <, >=, <=
  • instanceof
  • 그룹화 ()
  • 리터널 - 문자, 문자열, 숫자, null
  • 형변환
  • 메서드 호출
  • 필드 액세스 
  • 배열 액세스 []
  • 삼항 연산자 ?,:

누락된 연산

  • this
  • super
  • new 
  • 명시적 일반 호출 


null 병합 연산자 

 

nll 병합 연산자(??)는 왼쪽 연산자가 null이 아니면 왼쪽 연산자를 선택하고, null이면 오른쪽 연산자를 선택한다


android:text="@{memo.title??memo.content}"

이는 다음 삼항 연산자와 동일합니다.

android:text="@{memo.title!=null?memo.title:memo.content}"


이로써 데이터 바인딩에대한 포스팅을 마치겠습니다.

공식 문서에 있는 모든 내용을 정리한게 아니기때문에 해당 포스팅은 참고용으로 봐주시면 감사하겠습니다.

정확한 정보는 공식 Android Developer를 확인해주세요.




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








반응형