Android Data Binding 데이터 바 인 딩 상세 설명

작년 에 구 글 I/O 대회 에서 아주 강력 한 새로운 프레임 워 크 인 DataBinding 을 소 개 했 습 니 다.데이터 바 인 딩 프레임 워 크 는 우리 에 게 큰 편 의 를 가 져 다 주 었 습 니 다.예전 에 우 리 는 모든 Activity 에 많은 findViewById 를 써 야 했 습 니 다.번 거 로 울 뿐만 아니 라 코드 의 결합 도 추 가 했 습 니 다.만약 에 우리 가 DataBinding 을 사용 하면 그렇게 많은 findViewById 를 버 리 고 시간 을 절약 할 수 있 습 니 다.여기까지 말 하면 인터넷 에 도 빠 른 주해 프레임 워 크 가 많 지만 주해 프레임 워 크 는 DataBinding 과 비교 하기 가 쉽 지 않 습 니 다.또한 홈 페이지 문 서 는 DataBinding 이 XML 을 해석 하 는 속 도 를 높 일 수 있다 고 말 했 습 니 다.사실 DataBinding 의 좋 은 용 도 는 많은 소 리 를 줄 일 수 있 을 뿐만 아니 라 많은 소 리 를 줄 일 수 있 습 니 다.내 려 다 보면 알 게 될 거 야.
DataBinding 을 소개 하기 전에 그 환경 을 구축 하 는 것 을 배 워 야 합 니 다.작년 에 발 표 된 것 을 감안 하여 현재 AS 버 전 은 1.5 이상 일 것 입 니 다.1.5 버 전에 서 구축 하고 소개 하 겠 습 니 다.1.5 이전 에는 인터넷 에서 검색 할 수 있 습 니 다.제 가 보기 에는 인터넷 에서 대부분 1.3 의 사용 방법 을 소 개 했 기 때문에 1.5 이후 의 환경 구축 방법 에 대해 많이 알 지 못 했 습 니 다.
환경 구축
Android 의 Gradle 플러그 인 버 전 은 1.5.0-alpha 1 보다 낮 지 않 습 니 다.
classpath ‘com.android.tools.build:gradle:1.5.0'
그리고 해당 모듈(Module)의 build.grade 를 수정 합 니 다.

android {
 ....
 dataBinding {
  enabled = true
 }
}
메모:Android stuido 의 버 전 은 1.3 이상 이 어야 합 니 다.또한 Android Studio 는 현재 binding 대상 에 대해 자동 코드 알림 이 없고 컴 파일 할 때 만 검사 합 니 다.
이렇게 간단 하지만 1.3 과 예전 버 전 은 환경 구축 에 있어 조금 번 거 로 울 수 있 습 니 다(괜 찮 습 니 다.1.3 의 환경 구축 방법,인터넷 이 많 습 니 다).
기초 전시
우 리 는 구체 적 인 설명 을 하기 전에 간단 한 예 를 들 어 기 초 를 배우 고 DataBinding 의 커 다란 매력 을 보 여 드 리 겠 습 니 다.간단 한 특성 에 끌 릴 것 같 습 니 다.
우선 자바 bean 을 만 들 면 아주 간단 한 사용자 클래스 입 니 다.

package loonggg.net.databinding.bean;

/**
 * Created by loongggdroid on 2016/3/14.
 */
public class User {
 private String name;
 private String age;

 public User(String name, String age) {
  this.name = name;
  this.age = age;
 }

 public void setName(String name) {
  this.name = name;
 }

 public void setAge(String age) {
  this.age = age;
 }

 public String getName() {
  return this.name;
 }

 public String getAge() {
  return this.age;
 }
}

그 다음 에 DataBinding 을 사용 한 후의 레이아웃 파일 이 어떤 모습 인지 볼 까요?주요 변 화 는 layot 레이아웃 파일 에 있 습 니 다.

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

 <data>
  <variable
   name="user"
   type="loonggg.net.databinding.bean.User" />
 </data>

 <LinearLayout
  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="@{user.name}" />

  <TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="@{user.age}" />
 </LinearLayout>
</layout>

여 기 를 보 니 누 군 가 는 헷 갈 리 기 시 작 했 을 것 입 니 다.컨트롤 에 id 를 정의 하지 않 고@{}방법 을 사 용 했 습 니 다.어떻게 된 일 입 니까?먼저 바 쁘 지 않 습 니 다.이따가 설명해 드 리 겠 습 니 다.값 을 어떻게 전달 하 는 지,Activity 에서 어떻게 사용 하 는 지 다시 보 겠 습 니 다.

package loonggg.net.databinding;

import android.app.Activity;
import android.databinding.DataBindingUtil;
import android.os.Bundle;

import loonggg.net.databinding.bean.User;
import loonggg.net.databinding.databinding.ActivityMainBinding;

public class MainActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
  User user = new User("loonggg", "23");
  binding.setUser(user);
 }

}

Activity 를 보 니 깔끔 하고 상쾌 한 느낌 이 들 었 습 니 다.컨트롤 의 초기 화 findView ById 가 없 었 습 니 다.그리고 setText()로 가서 두 줄 의 코드 만 추 가 했 습 니 다.
실행 결 과 는 말 할 필요 도 없 이 분명 loonggg 와 23 이 표 시 될 것 입 니 다.효과 도 는 다음 과 같 습 니 다.

기초 해석
레이아웃 생명
예 를 들 어 우 리 는 소 개 를 끝 냈 습 니 다.예 에 나타 난 새로운 것들 에 대해 설명 할 필요 가 있 습 니 다.자바 빈 에 게 는 설명 하지 않 습 니 다.모두 가 알 고 있 을 것 입 니 다.우 리 는 레이아웃 파일 부터 말 하 겠 습 니 다.이전에 사 용 했 던 xml 에 비해 루트 노드 는 구체 적 인 특정한 layot(예 를 들 어 LinearLayout)에서 layot 로 바 뀌 었 고 그 안에 data 노드 와 전통 적 인 보 기 를 포함 했다.이곳 의 data 노드 는 마치 View 와 Modle 을 연결 하 는 다리 와 같다.이 data 노드 에서 variable 변 수 를 설명 하면 레이아웃 파일 에 쉽게 전달 할 수 있 습 니 다.

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

<!--type              User,     ,    ,           user-->
 <data>
  <variable
   name="user"
   type="loonggg.net.databinding.bean.User" />
 </data> 
 <LinearLayout>
  ……
 </LinearLayout>
</layout>

변수 이름 user
변수 형식 은"loonggg.net.databinding.bean.User"입 니 다.
type 에서 설명 한 것 은 바로 우리 의 사용자 실체 류 User 입 니 다.반드시 다 쓰 고 가방 이름 을 가 져 가 야 합 니 다.우 리 는 이 실체 류 에 user 라 고 명명 합 니 다.TextView 의@{user.name}은 바로 이 user 의 이름 을 보 여 주 는 것 입 니 다.age 역시 마찬가지 입 니 다.
바 인 딩 변수
레이아웃 파일 에 대응 하지만 값 은 어떻게 들 어 갑 니까?이것 이 바로 우리 가 사용 하고 자 하 는 Activity 의 두 줄 코드 입 니 다.이것 은 실체 류 와 레이아웃 파일 을 연결 합 니 다.MainActivity 의 onCreate 를 수정 하고 DatabingUtil.setContentView()로 setContentView()를 교체 한 다음 user 대상 을 만 들 고 bing.setUser(user)를 통 해 variable 와 연결 합 니 다.

@Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
  User user = new User("loonggg", "23");
  binding.setUser(user);
 }
고급 용법
import 용법
사실 data 노드 도 import 용법 을 지원 합 니 다.예 를 들 어:

<data>
  <import type="loonggg.net.databinding.bean.User "/>
  <variablename="user"type="User" />
</data>
여기 서 주의해 야 할 것 은 import 는 자바 처럼 import xx.xxx.*를 사용 할 수 없습니다.가 져 올 클래스 이름 을 구체 적 으로 써 야 합 니 다.
유명무실 하 다
여기까지 와 서 import 에 같은 이름 의 두 종류 가 있 으 면 어떻게 하 냐 고 물 어 볼 수도 있 습 니 다.겁 먹 지 마 세 요.사람들 이 주도면밀 하 게 생각 하 는데 별명 이나 닉네임 을 지어 도 될까요?예 를 들 면:

・・・
<data> 
 <import type="xxx.User" alias="MyUser"> 
 <import type="xxx.xx.User"> 

 <variable 
   name="user" 
   type="User" /> 
 <variable 
   name="myUser" 
   type="MyUser"/> 
</data> 
<TextView xxx:@{myUser.getName()}> 
<TextView xxx:@{user.getName()}>
・・・

변수 정의 고급 용법
위 에서 우 리 는 xml 에서 간단 한 변 수 를 정의 하 는 방법 을 배 웠 다.우 리 는 List,Map 등 과 같은 집합 변 수 를 정의 하지 않 았 다.그렇다면 이런 집합 변 수 는 어떻게 정의 해 야 합 니까?사실 정의 방식 은 우리 위의 기본 과 일치 합 니 다.차이 점 은 바로 우리 가 키 의 변 수 를 정의 해 야 한 다 는 것 입 니 다.예 를 들 어:

<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
  <data> 
   <import type="android.graphics.Bitmap" /> 
   <import type="java.util.ArrayList" /> 
   <import type="java.util.HashMap" /> 
   <!--       -->
   <variable 
    name="list" 
    type="ArrayList<String>" /> 
   <variable 
    name="map" 
    type="HashMap<String, String>" /> 
   <variable 
    name="array" 
    type="String[]" /> 
   <!--            -->
   <variable 
    name="listKey" 
    type="int" /> 
   <variable 
    name="mapKey" 
    type="String" /> 
   <variable 
    name="arrayKey" 
    type="int" /> 

   <!--    ,    int   -->
   <variable 
    name="str" 
    type="String"/> 
   <variable 
    name="error" 
    type="boolean"/> 
   <variable 
    name="num" 
    type="int" /> 

  </data> 

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

   <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@{list[listKey]}"/> 

   <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@{map[`name`]}"/> 
   <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@{array[0]}"/> 

   <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@{str}"/> 
   <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@{String.valueOf(num)}"/> 
  </LinearLayout> 
 </layout>

이벤트 바 인 딩
xml 에서 android.view.View.OnClickListener 를 직접 가 져 오고 클릭 이 벤트 를 만 들 수 있 습 니 다.

<variable
 name="clickListener"
 type="android.view.View.OnClickListener" />
...
 android:onClick="@{clickListener}"
...

holder.binding.setClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    //do something
  });
표현 식
사실 xml 파일 에 서 는 표현 식 을 지원 합 니 다.예 를 들 어 다음 과 같 습 니 다.

<TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text='@{error ? "error" : "ok"}'/>
이것 은 불 값 의 사용 이다.
다음은 표현 식 이 지원 하 는 문법 과 지원 하지 않 는 문법 을 살 펴 보 겠 습 니 다.
지원 하 는 표현 식:
  • Mathematical + - / * %
  • String concatenation +
  • Logical && ||
  • Binary & | ^
  • Unary + - ! ~
  • Shift >> >>> <<
  • Comparison == > < >= <=
  • instanceof
  • Grouping ()
  • Literals - character, String, numeric, null
  • Cast
  • Method calls
  • Field access
  • Array access []
  • Ternary operator ?:
  • 지원 하지 않 는 표현 식:
  • this
  • super
  • new
  • Explicit generic invocation
  • id 가 있 는 컨트롤 의 할당 방식
    xml 파일 에 있 는 컨트롤 의 할당 도 자바 파일 에서 자바 로 이 루어 질 수 있 습 니 다.저 는 맨 위 에 있 는 간단 한 예 로 TextView 에 설 치 된 id 가 다음 과 같 습 니 다.
    
    <TextView
       android:id="@+id/name"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       />
    
    Activity 에서 이렇게 값 을 부여 합 니 다:
    
    @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
      binding.name.setText("      ");
     }
    
    여기 서 기본 적 인 부분 을 보면 다 말 할 수 있 습 니 다.사실은 더 고 급 스 러 운 용법 도 많 습 니 다.예 를 들 어 ListView 에서 어떻게 사용 하 는 지 등 은 여러분 이 자 료 를 찾 아 보고 공부 할 수 있 습 니 다.이렇게 하면 더욱 깊이 알 수 있 습 니 다.이 글 이 모두 에 게 도움 이 되 기 를 바 랍 니 다.DataBinding 은 지금부터 사용 해 보 실 수 있 습 니 다.
    이상 은 Android Data Binding 데이터 에 연 결 된 자 료 를 정리 한 것 입 니 다.추 후 관련 자 료 를 계속 보충 하 겠 습 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기