ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] DataBinding
    Android 2022. 10. 15. 15:11

    findViewById

    - 실시간으로 모든 리소스 트리를 뒤져서 해당 데이터를 찾아가야 함

    - 실행도중에 발생하는 일이라 프로그램의 수행이 느리게 됨

     

    -> 미리 바인딩 시켜놓고 직접 참조하면 일일이 찾아갈 필요가 없기 때문에 검색 오버레드가 줄어들음

     


    데이터 바인딩 사용하기

    1. build.gradle 파일 수정

    dataBinding{
            enabled = true
        }

    2. xml 파일 수정

    - layout 태그로 전체를 감싸줌

    - 데이터 바인딩의 사용설정을 해주면 레이아웃xml 파일과 연결되어 자동으로 설계되는 바인딩 클래스가 만들어짐

     

     

    3. <data> 요소

    - 뷰들과 연결되어 보여줄 데이터를 가진 데이터 클래스 지정후 레이아웃 파일 안에서 사용할 식별명 정해주는 요소

    <?xml version="1.0" encoding="utf-8"?>
    <!-- Data Binding의 root는 <layout> -->
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <!-- 1. 레이아웃뷰와 바인딩할 데이터들 명칭과 클래스지정   -->
        <data>
            
        </data>
    
    
        <!-- 2. 레이아웃 뷰 : 기존에 root로 만들었던 뷰   -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:padding="16dp">
    
        </LinearLayout>
    
    </layout>
    출처: https://kitesoft.tistory.com/117 [안드로이드 앱 개발:티스토리]

    User.class

    - 앱에 사용될 데이터를 저장할 변수를 가진 클래스 

    public class User{
    	
        //TextView에서 보여줄 데이터를 저장하고 있을 변수
        String name;
        
        //생성자메소드
        public User(String name){
        	this.name = name;
        }
        
    }
    출처: https://kitesoft.tistory.com/117 [안드로이드 앱 개발:티스토리]

    - <data> 안에 <variable>에 변수 선언해줌

    <?xml version="1.0" encoding="utf-8"?>
    <!-- Data Binding의 root는 <layout> -->
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <!-- 1. 레이아웃뷰와 바인딩할 데이터들 명칭과 클래스지정   -->
        <data>
            <!-- 데이터바인딩으로 연결할 User클래스 객체를 이 레이아웃에서는 user 라는 이름으로 참조하여 사용하겠다는 설정  -->
            <variable
                name="user" // 개발자가 지정
                type="com.kitesoft.databindingjava.User" />
    
        </data>
    
    
        <!-- 2. 레이아웃 뷰 : 기존에 root로 만들었던 뷰   -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:padding="16dp">
    
        </LinearLayout>
    
    </layout>
    출처: https://kitesoft.tistory.com/117 [안드로이드 앱 개발:티스토리]

     

    - @{user.name} 으로 textview에 띄울 text값을 변수로 지정하기

    <?xml version="1.0" encoding="utf-8"?>
    <!-- Data Binding의 root는 <layout> -->
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <!-- 1. 레이아웃뷰와 바인딩할 데이터들 명칭과 클래스지정   -->
        <data>
            <!-- 데이터바인딩으로 연결할 User클래스 객체를 이 레이아웃에서는 user 라는 이름으로 참조하여 사용하겠다는 설정  -->
            <variable
                name="user"
                type="com.kitesoft.databindingjava.User" />
    
        </data>
    
    
        <!-- 2. 레이아웃 뷰 : 기존에 root로 만들었던 뷰   -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:padding="16dp">
    
            <!-- 텍스트뷰의 글씨를 <data>태에서 지정한 <variable>그 요소의 User객체의 멤버값 사용 -->
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="8dp"
                android:text="@{user.name}"/>
    
        </LinearLayout>
    
    </layout>
    출처: https://kitesoft.tistory.com/117 [안드로이드 앱 개발:티스토리]

     

    4. MainActivity.java

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.databinding.DataBindingUtil;
    
    import android.os.Bundle;
    
    import com.kitesoft.databindingjava.databinding.ActivityMainBinding;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //setContentView(R.layout.activity_main);
    
            //DataBindingUtil클래스를 통해 이 MainActivity에게 activit_main.xml 레이아웃을 ContentView()로 설정하고 연결하여 제어하는 클래스객체를 리턴
            //클래스의 이름의 xml레이아웃 파일명을 기준으로 자동으로 설계되어 만들어짐. [ex. activity_main.xml 이면 ActivityMainBinding,  activity_intro.xml 이면 ActivityIntroActivityBinding ]
            ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    
            //xml문서의 <data>요소 안에 있는 <variable>의 type에 지정한 클래스 객체를 만들어 set()해주면 레이아웃파일의 뷰들에 설정한 객체의 값들이 반영됨
            binding.setUser(new User("sam")); //초기값으로 지정할 User객체 생성 및 바인딩객체에게 설정
    
        }
    }
    출처: https://kitesoft.tistory.com/117 [안드로이드 앱 개발:티스토리]

     

    * 정리 *

    자바에서 뷰들을 findViewById()와 같은 방법으로 참조하여 값을 설정하는 것이 아니라

    데이터를 가진 클래스 (User) 객체를 만들고 xml레이아웃에서 미리 연결만 해 놓으면 알아서 UI에 적용되도록 하는 기법

     

    : 뷰에게 특정 변수를 설정(연결) 하고 그 변수의 값을 바꿈


    이때 우리가 일반적으로 사용하는 String이나 int같은 자료형의 변수를 이용하면 연결되어 뷰에 보여지기는 하지만,

    변수값을 바꾸어도 뷰가 이를 자동으로 인지하여 화면을 갱신하지 않음

    -> 일반적인 자료형의 변수가 아니라 관찰(Observe)이 가능한 자료형의 변수를 만들어서 뷰들에 연결해야함

    -> Observale 변수

     

    1) 자바의 primitive 자료형(기본 자료형) 인 boolean ~ double에 대응되는 ObservableBoolean ~ ObservableDouble

    2) List 또는 Map 컬렉션에 대응되는 ObservableList or ObservableMap

    3) String이나 Item같은 자바의 참조형 타입들에 대응되는 ObservableField<XXX> : <>제네릭안에 참조형 타입명 지정

     

     

    1. User.java

    import androidx.databinding.ObservableBoolean;
    import androidx.databinding.ObservableField;
    import androidx.databinding.ObservableInt;
    
    public class User {
    
        //값 변경이 관찰되는 멤버변수 ObservableXXX : primitive type XXX && List Or Map  && Reference type is ObservableField<>
        public ObservableField<String> name= new ObservableField<>();
        public ObservableInt age= new ObservableInt();
        public ObservableBoolean fav= new ObservableBoolean();
        
    
        //constructor
        public User(String name, int age, boolean fav) {
        	//파라미터로 받은 일반적인 자료형을 ObservableXXX 변수에 대입해주기 위해 .set()메소드 이용 - 자료형이 다르기에 대입연산자(=)로 값 저장불가
            this.name.set(name);
            this.age.set(age);
            this.fav.set(fav);
        }
    
    }
    출처: https://kitesoft.tistory.com/118?category=549069 [안드로이드 앱 개발:티스토리]

    2. Activity 코드와 xml 코드는 따로 수정하지 않음

    3. 버튼 추가 후, 버튼 클릭시에 User 클래스의 name 변수값 변경하기

    - onClick속성에 @{user::메소드명} 으로 설정하면 해당 메소드가 클릭이벤트에 반응하여 자동 호출

     

    <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="change name"
                android:onClick="@{user::changeName}"/>
    
    출처: https://kitesoft.tistory.com/118?category=549069 [안드로이드 앱 개발:티스토리]

     

    package com.kitesoft.databindingjava;
    
    import android.view.View;
    import android.widget.CompoundButton;
    import android.widget.Toast;
    
    import androidx.databinding.ObservableBoolean;
    import androidx.databinding.ObservableField;
    import androidx.databinding.ObservableInt;
    
    public class User {
    
        //값 변경이 관찰되는 멤버변수 ObservableXXX : primitive type XXX && List Or Map  && Reference type is ObservableField<>
        public ObservableField<String> name= new ObservableField<>();
        public ObservableInt age= new ObservableInt();
        public ObservableBoolean fav= new ObservableBoolean();
    
    
        //constructor
        public User(String name, int age, boolean fav) {
            this.name.set(name);
            this.age.set(age);
            this.fav.set(fav);
        }
    
        //change name click callback method : onclick속성에 반응하는 액티비티의 콜백메소드 작업을 데이터가 있는 이 클래스에서 코
        public void changeName(View view){
            name.set("ROBIN"); //Observable객체들의 값 변경은 반드시 set()을 해야 자동 값 갱신이 이루어짐 [ ObservableXXX 객체들은 어차피 = 대입연산자 사용 못함]
        }
    
    }
    출처: https://kitesoft.tistory.com/118?category=549069 [안드로이드 앱 개발:티스토리]

     

     

     

     

     

     

    https://arvigoes.tistory.com/108

     

    11. Data Binding (데이터 바인딩) - Android Studio (안드로이드)

    데이터 바인딩을 사용하지 않으면 findViewById 같은 함수를 통해 실시간으로 모든 리소스 트리 를 뒤져서 해당 데이터를 찾아가야 합니다. 실시간이라면 실행도중에 발생하는 일이라 프로그램의

    arvigoes.tistory.com

    https://kitesoft.tistory.com/118?category=549069 

     

    [안드로이드 Android] 데이터 바인딩 Data Binding #2 - 버튼클릭이벤트 처리하기

    이번 글에서는 데이터바인딩에 대한 2번째 실습으로 버튼을 클릭하였을때 TextView의 글씨가 바뀌도록 해보겠습니다. 실제 앱개발 과정에서 가장 빈번하게 작업하는 유형입니다. 특정 이벤트가

    kitesoft.tistory.com

     

    'Android' 카테고리의 다른 글

    [Android] MVVM 패턴 적용 - ACC 예제  (0) 2022.10.11
    [Android] MVVM 패턴 적용 - ACC  (0) 2022.10.10
Designed by Tistory.