Android/DataBinding
${Harvey}
2022. 11. 21. 22:40
2022. 11. 21. 22:40
class CustomDataAdapter (private val dataSet : ArrayList<String>) : RecyclerView.Adapter<CustomDataAdapter.ViewHolder>(){
class ViewHolder(binding : TextRowItemBinding) : RecyclerView.ViewHolder(binding.root){
val myText : TextView = binding.myText
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):ViewHolder {
val view = DataBindingUtil.inflate<TextRowItemBinding>(LayoutInflater.from(parent.context),
R.layout.text_row_item,parent,false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.myText.text = dataSet[position]
}
override fun getItemCount(): Int {
return dataSet.size
}
}
class DataBindingActivity : AppCompatActivity() {
private lateinit var binding : ActivityDataBindingBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this,R.layout.activity_data_binding)
val array = ArrayList<String>()
array.add("a")
array.add("b")
array.add("c")
array.add("d")
array.add("e")
array.add("f")
array.add("g")
array.add("h")
array.add("j")
array.add("k")
val customViewAdapter = CustomDataAdapter(array)
val rv = binding.rv
rv.adapter = customViewAdapter
rv.layoutManager = LinearLayoutManager(this)
return
}
}
text_row_item.xml (item의 res파일에도 가장 밖에 layout을 둘러줘야함.)
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp">
<TextView
android:id="@+id/myText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="HELLO"
android:textSize="40sp" />
</LinearLayout>
</layout>
${Harvey}
2022. 11. 21. 22:39
2022. 11. 21. 22:39
package com.example.bindingtest
data class Person(
val name: String,
val age: Int
)
res 파일에 data 형식 지정. type 은 dataclass 경로.
<?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 형식 지정.
<data>
<variable
name="user"
type="com.example.bindingtest.Person" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
data class 형식에 맞춰 집어넣고
res파일 user와 결합.
res파일에서도 logic을 구현하여 실행 가능.(비추)
class MainActivity : AppCompatActivity() {
private lateinit var binding : ActivityMainBinding
var testCount = 20
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
val person = Person("강병진",20)
binding.user = person
}
fun myClick(view : View){ //버튼 누를 때마다 testCount++
Log.d("MainActivity","onClick")
testCount++
val person = Person("강병진",testCount)
binding.user = person
}
}
<TextView
android:id="@+id/dataBindingEx"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
android:textSize="50sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!-- xml에서 logic을 넣는 것은 선호하지 않는 방식. -->
<TextView
android:id="@+id/dataBindingEx2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.age > 30 ? `나이 많음` : `나이 적음`}"
android:textSize="50sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.501"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/dataBindingEx"
app:layout_constraintVertical_bias="0.174" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{Integer.toString(user.age)}"
android:textSize="50sp"
app:layout_constraintBottom_toTopOf="@+id/dataBindingEx"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="myClick"
android:text="btn"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/dataBindingEx2" />
${Harvey}
2022. 11. 21. 22:38
2022. 11. 21. 22:38
ViewBinding이란 findViewById를 개발자 대신 자동화 해 주는 기능이라고 보면 되고, DataBinding이란 ViewBinding 기능에 더해 imagePage.setText()와 같이 실제 데이터를 세팅해 주는 부분을 살짝 wrapping 시켜준다고 보면 된다.
build.gradle에 추가하기.
kotlinOptions {
jvmTarget = '1.8'
}
//dataBinding 추가.
buildFeatures{
dataBinding = true
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.5.1'
res파일에서 가장 바깥 부분에 layout으로 감싸주기.(Fragment랑 연결된 res파일도 동일.)
<?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">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/dataBindingEx"
android:textSize="50sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout> //이부분
class MainActivity : AppCompatActivity() {
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
binding.dataBindingEx.text = "바뀐 텍스트"
binding.dataBindingEx.setOnClickListener{
val intent = Intent(this,SecondActivity::class.java)
startActivity(intent)
}
}
}
package com.example.bindingtest
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import com.example.bindingtest.databinding.FragmentTestBinding
class TestFragment : Fragment() {
lateinit var binding: FragmentTestBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_test, container,false)
binding.testText.text = "변경된 텍스트"
return binding.root
}
}