데이터바인딩(DataBinding)
-
특징
-
XML 파일에 Data를 연결하여 사용할 수 있게 도와주는 Android JetPack 라이브러리의 기능 중 하나
-
불필요한 코드(글루 코드, ex. findViewById())의 사용 최소화
-
-
구현
-
DataBinding 적용 전 코드
-
activity_main.xml
1234567891011121314151617181920<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns: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"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView"... 생략 .../><Buttonandroid:id="@+id/btn_change"... 생략 .../></androidx.constraintlayout.widget.ConstraintLayout>cs -
MainActivity.java
123456789101112131415161718192021222324252627282930313233package com.example.databinding;import androidx.appcompat.app.AppCompatActivity;import //...생략public class MainActivity extends AppCompatActivity {Button ChangeBtn;TextView textView;int num;String str;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//---- layout 설정setContentView(R.layout.activity_main);//---- XML 파일의 TextView, Button 받아오기textView = findViewById(R.id.textView);ChangeBtn = findViewById(R.id.btn_change);//---- 클릭 이벤트 설정(클릭 시 textView 숫자 ++)ChangeBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {num = Integer.parseInt((String)textView.getText());str = Integer.toString(num+1);textView.setText(str);}});}}cs
-
-
DataBinding 적용
-
build.gradle(app)에 dataBinding 추가 후 SyncNow
123456789android {... 생략 ...dataBinding {enable true}... 생략 ...}cs -
원래의 activity_main.xml을 <layout> 태그로 감싸고 <data> 추가
12345678910111213141516171819202122232425<?xml version="1.0" encoding="utf-8"?><layout 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"><!-- 추가 --><data><variablename="main"type="com.example.databinding.MainActivity"/></data><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><!-- 아래 항목은 위(<layout> 태그)와 중복되므로 삭제--><!-- 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"-->... 생략 ...</androidx.constraintlayout.widget.ConstraintLayout></layout>cs -
MainActivity.java 수정
12345678910111213141516171819202122232425262728293031package com.example.databinding;import //...생략import com.example.databinding.databinding.ActivityMainBinding;public class MainActivity extends AppCompatActivity {int num;String str;//++++ 수정 1) Binding 객체 생성ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//++++ 수정 2) layout 설정binding = DataBindingUtil.setContentView(this, R.layout.activity_main);//---- 클릭 이벤트 설정(클릭 시 textView 숫자 ++)binding.btnChange.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//++++ 수정 3) 생성한 binding 객체로 XML 파일 내의 View에 접근num = Integer.parseInt((String)binding.textView.getText());str = Integer.toString(num+1);binding.textView.setText(str);}});}}cs
-
-
+ Recycling View에 DataBinding 적용
-
구현
-
build.gradle(app) 수정
1234567android {... 생략dataBinding {enable true}... 생략}cs -
activity_main.xml 수정
12345678910111213<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><data><variablename="main"type="com.example.recycler.MainActivity" /></data><!-- ConstraintLayout 태그 부분 --></layout>cs -
MainActivity.java 수정
1234567891011121314151617181920212223242526// ...생략import com.example.recycler.databinding.ActivityMainBinding;// ...생략public class MainActivity extends AppCompatActivity {//++++ Binding 객체 추가ActivityMainBinding binding;InfoAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//++++ Layout 설정binding = DataBindingUtil.setContentView(this, R.layout.activity_main);// ==생략 == (ArrayList에 데이터 추가)//++++ RecyclerView에 LayoutManager 지정binding.recyclerView.setLayoutManager(new LinearLayoutManager(this));//++++ RecyclerView에 Adapter 지정adapter = new InfoAdapter(list);binding.recyclerView.setAdapter(adapter);}}cs -
item_info.xml 수정
12345678910111213<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="movie"type="com.example.recycler.Info"/></data><!-- FrameLayout 태그 부분 --></layout>cs -
InfoAdapter.java 수정
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354// ... 생략import com.example.recycler.databinding.ItemInfoBinding;// ... 생략public class InfoAdapter extends RecyclerView.Adapter<InfoAdapter.ViewHolder> {//---- 데이터가 저장될 배열private ArrayList<Info> data = null;//---- 초기화InfoAdapter(ArrayList<Info> list) {data = list;}//---- 아이템 뷰를 저장하고 화면에 보여주는 ViewHolder 클래스 생성static class ViewHolder extends RecyclerView.ViewHolder {//++++ Binding 객체ItemInfoBinding binding;//++++ 생성자의 인자를 Binding 객체로 수정ViewHolder(ItemInfoBinding binding) {super(binding.getRoot());this.binding = binding;}//++++ 데이터 넣는 함수 분리하여 구현public void bind(Info info) {binding.tvName.setText(info.getName());binding.tvAge.setText(info.getAge());}}//---- ViewHolder 생성@NonNull@Overridepublic InfoAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {//++++ 인플레이션ItemInfoBinding binding = ItemInfoBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);return new ViewHolder(binding);}//++++ 데이터를 bind()에 전달@Overridepublic void onBindViewHolder(@NonNull InfoAdapter.ViewHolder holder, int position) {Info info = data.get(position);holder.bind(info);}//---- 전체 데이터 수 리턴@Overridepublic int getItemCount() {return data.size();}}cs
-
'안드로이드' 카테고리의 다른 글
[안드로이드] 하단에 버튼 고정시키고 가운데에 스크롤 뷰(Scroll View) 만들기 (1) | 2021.01.20 |
---|---|
T map API 사용해 지도 띄우기 (0) | 2021.01.19 |
안드로이드 drawable 사용하기 (0) | 2021.01.14 |
깃허브 [remote reject] 에러 발생 시 해결 (0) | 2021.01.13 |
스플래시(Splash) 화면 만들기 (0) | 2021.01.12 |