๊ตฌ๊ธ์์ ์ ๊ณตํ๋ ๊ต์ก์๋ฃ๋ฅผ ์ ๋ฆฌํ๊ธฐ ์ํ ํฌ์คํธ์ ๋๋ค.
View
์ ๋๋น, ๋์ด์ ๊ฐ์ ๋ ์ด์์์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ ๋ dp๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ์ ConstraintLayout์ ์ด์ฉํด ํผํ ์ ์์ต๋๋ค.
๋ ์ด์์์ด ํฌํจ๋์ด ์๋ ๋ทฐ์ ์์ฑ์ ๋ํ ๊ท์ ๋๋ ์ ํ
์์ ์ปจํฐ์ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์ฝ ์กฐ๊ฑด์ ์ค์ ํ ์ ์์ต๋๋ค.
layout_constraint<SourceConstraint>_to<TargetConstraint>Of
TextView ์์ฑ์ ์์
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
์์น ๊ธฐ์ค์ ๋ํ๋
๋๋ค.
๋ถ๋ชจ์ ์ ์ค์ TextView
๋ฅผ ๋ฐฐ์นํ๋ ์์ ์
๋๋ค.
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
...
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
LinearLayout
๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.๋ค์ํ ์ฒด์ธ ์คํ์ผ์ ์ฌ์ฉํ์ฌ view ์ฌ์ด์ ๊ณต๊ฐ์ ์กฐ์ ํฉ๋๋ค.
์์ง, ์ํ ๊ฐ์ด๋๋ผ์ธ์ ์ฌ์ฉํ์ฌ view๋ฅผ ๋ฐฐ์นํ ๋ชจ์ต์
๋๋ค.
์์ง ๊ฐ์ด๋๋ผ์ธ์ ์ฌ์ฉํ์ผ๋ฉฐ ์์ ์์น์์ 16dp ๋จ์ด์ ธ ์์ต๋๋ค.
<ConstraintLayout>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/start_guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="16dp" />
<TextView ...
app:layout_constraintStart_toEndOf="@id/start_guideline" />
</ConstraintLayout>
widget
์ธํธ์ visibility๋ฅผ ์ ์ดํ ์ ์๋คconstraint_referenced_ids
๋ฅผ ์ฌ์ฉํด์ Group ๋์์ ์ค์ ํฉ๋๋ค.
<androidx.constraintlayout.widget.Group
android:id="@+id/group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:constraint_referenced_ids="locationLabel,locationDetails"/>
override fun onClick(v: View?) {
if (group.visibility == View.GONE) {
group.visibility = View.VISIBLE
button.setText(R.string.hide_details)
} else {
group.visibility = View.GONE
button.setText(R.string.show_details)
}
}
๋งค๋ฒ view ๊ณ์ธต์ ์ํํฉ๋๋ค.
๋ ์ด์์์ UI ๊ตฌ์ฑ ์์๋ฅผ ์ฑ์ data source์ ๋ฐ์ธ๋ฉํฉ๋๋ค.
์ฑ ์์ค์ build.gradle ํ์ผ์ ์ถ๊ฐํฉ๋๋ค.
android {
...
buildFeatures {
dataBinding true
}
}
์ ์ฉํ XML์ layout tag๋ก ๊ฐ์ธ์ค๋๋ค.
<layout>
<androidx.constraintlayout.widget.ConstraintLayout>
<TextView ... android:id="@+id/username" />
<EditText ... android:id="@+id/password" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
// ์ ๊ฑฐ
setContentView(R.layout.activity_main)
// ๋์ฒด
val binding: ActivityMainBinding = DataBindingUtil.setContentView( this, R.layout.activity_main)
// XML view ์ ๊ทผ ๋ฐฉ์
binding.username = "Melissa
<layout>
<data>
<variable name="name" type="String"/>
</data>
<androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/textView"
android:text="@{name}" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
MainActivity.kt ์์ binding.name = "John"
์ค์ ๊ฐ๋ฅํฉ๋๋ค.
XML์์ ๋ค์ํ ํฌํ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฐธ๊ณ
<layout>
<data>
<variable name="name" type="String"/>
</data>
<androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/textView"
android:text="@{name.toUpperCase()}" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
widget
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
res/layout/item_view.xml
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/number"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</FrameLayout>
class MyAdapter(val data: List<Int>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
class MyViewHolder(val row: View) : RecyclerView.ViewHolder(row) {
val textView = row.findViewById<TextView>(R.id.number)
}
// item layout ์ค์ ๋ฐ ViewHolder ์์ฑ
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val layout = LayoutInflater.from(parent.context).inflate(R.layout.item_view,
parent, false)
return MyViewHolder(layout)
}
// holder์ ํ์ํ ๋ฐ์ธ๋ฉ ์์
์งํ
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.textView.text = data.get(position).toString()
}
// list item count ์ค์
override fun getItemCount(): Int = data.size
MainActivity.kt :
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rv: RecyclerView = findViewById(R.id.rv)
// RecyclerView layoutManager ์ธํ
rv.layoutManager = LinearLayoutManager(this)
// RecyclerView.Adapter ์ธํ
rv.adapter = MyAdapter(IntRange(0, 100).toList())
}