SlideShare a Scribd company logo
1 of 54
This work is licensed under the Apache 2 license.
This work is licensed under the Apache 2 license.
Android Development with Kotlin v1.0 1
Lesson 5:
Layouts
This work is licensed under the Apache 2 license.
Android Development with Kotlin
About this lesson
Lesson 5: Layouts
● Layouts in Android
● ConstraintLayout
● Additional topics for ConstraintLayout
● Data binding
● Displaying lists with RecyclerView
● Summary
2
This work is licensed under the Apache 2 license.
Android Development with Kotlin 3
Layouts in Android
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Android devices
4
● Android devices come in many
different form factors.
● More and more pixels per inch
are being packed into device
screens.
● Developers need the ability to
specify layout dimensions that
are consistent across devices.
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Density-independent pixels (dp)
● Density-independent pixels (dp)
take screen density into account.
● Android views are measured in
density-independent pixels.
● dp = (width in pixels * 160)
screen density
5
80dp
160dp
Use dp when specifying sizes in your layout, such as the width or height of views.
Hello
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Screen-density buckets
6
Density qualifier Description DPI estimate
ldpi (mostly unused) Low density ~120dpi
mdpi (baseline density) Medium density ~160dpi
hdpi High density ~240dpi
xhdpi Extra-high density ~320dpi
xxhdpi Extra-extra-high density ~480dpi
xxxhdpi Extra-extra-extra-high density ~640dpi
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Android View rendering cycle
7
Measure
Layout
Draw
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Drawing region
8
What we see:
How it's drawn:
This work is licensed under the Apache 2 license.
Android Development with Kotlin
View margins and padding
9
View with margin View with margin and padding
View View
View
This work is licensed under the Apache 2 license.
Android Development with Kotlin 10
ConstraintLayout
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Deeply nested layouts are costly
● Deeply nested ViewGroups require more computation
● Views may be measured multiple times
● Can cause UI slowdown and lack of responsiveness
11
Use ConstraintLayout to avoid some of these issues!
This work is licensed under the Apache 2 license.
Android Development with Kotlin
What is ConstraintLayout?
● Recommended default layout for Android
● Solves costly issue of too many nested layouts, while
allowing complex behavior
● Position and size views within it using a set of constraints
12
This work is licensed under the Apache 2 license.
Android Development with Kotlin
What is a constraint?
A restriction or limitation on the
properties of a View that the layout
attempts to respect
13
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Relative positioning constraints
Can set up a constraint relative to the parent container
Format:
layout_constraint<SourceConstraint>_to<TargetConstraint>Of
14
Example attributes on a TextView:
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Relative positioning constraints
15
Hello!
Top
Bottom
Baseline
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Relative positioning constraints
16
Start
Left Right
End
Hello!
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Simple ConstraintLayout example
<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>
17
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Layout Editor in Android Studio
You can click and drag to add constraints to a View.
18
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Constraint Widget in Layout Editor
19
Fixed
Wrap content
Match constraints
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Wrap content for width and height
20
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Wrap content for width, fixed height
21
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Center a view horizontally
22
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Use match_constraint
23
Can’t use match_parent on a child view, use match_constraint instead
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Chains
● Let you position views in relation to each other
● Can be linked horizontally or vertically
● Provide much of LinearLayout functionality
24
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Create a Chain in Layout Editor
1. Select the objects you want to be in
the chain.
2. Right-click and select Chains.
3. Create a horizontal or vertical chain.
25
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Chain styles
Adjust space between views with these different chain styles.
26
Spread Chain
Spread Inside Chain
Weighted Chain
Packed Chain
This work is licensed under the Apache 2 license.
Android Development with Kotlin 27
Additional topics for
ConstraintLayout
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Guidelines
● Let you position multiple views relative to a single guide
● Can be vertical or horizontal
● Allow for greater collaboration with design/UX teams
● Aren't drawn on the device
28
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Guidelines in Android Studio
29
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Example Guideline
<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>
30
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Creating Guidelines
● layout_constraintGuide_begin
● layout_constraintGuide_end
● layout_constraintGuide_percent
31
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Groups
● Control the visibility of a set of widgets
● Group visibility can be toggled in code
32
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Example 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"/>
33
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Groups app code
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)
}
}
34
This work is licensed under the Apache 2 license.
Android Development with Kotlin 35
Data binding
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Current approach: findViewById()
Traverses the View hierarchy each time
36
val name = findViewById(...)
val age = findViewById(...)
val loc = findViewById(...)
name.text = …
age.text = …
loc.text = …
<ConstraintLayout … >
<TextView
android:id="@+id/name"/>
<TextView
android:id="@+id/age"/>
<TextView
android:id="@+id/loc"/>
</ConstraintLayout>
findViewById
MainActivity.kt activity_main.xml
findViewById
findViewById
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Use data binding instead
Bind UI components in your layouts to data sources in your app.
37
activity_main.xml
MainActivity.kt
Val binding:ActivityMainBinding
binding.name.text = …
binding.age.text = …
binding.loc.text = …
<layout>
<ConstraintLayout … >
<TextView
android:id="@+id/name"/>
<TextView
android:id="@+id/age"/>
<TextView
android:id="@+id/loc"/>
</ConstraintLayout>
</layout>
initialize binding
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Modify build.gradle file
android {
...
buildFeatures {
dataBinding true
}
}
38
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Add layout tag
<layout>
<androidx.constraintlayout.widget.ConstraintLayout>
<TextView ... android:id="@+id/username" />
<EditText ... android:id="@+id/password" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
39
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Layout inflation with data binding
Replace this
40
setContentView(R.layout.activity_main)
with this
val binding: ActivityMainBinding = DataBindingUtil.setContentView(
this, R.layout.activity_main)
binding.username = "Melissa"
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Data binding layout variables
<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>
41
In MainActivity.kt:
binding.name = "John"
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Data binding layout expressions
<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>
42
This work is licensed under the Apache 2 license.
Android Development with Kotlin 43
Displaying lists with
RecyclerView
This work is licensed under the Apache 2 license.
Android Development with Kotlin
RecyclerView
● Widget for displaying lists of data
● "Recycles" (reuses) item views to make scrolling more
performant
● Can specify a list item layout for each item in the dataset
● Supports animations and transitions
44
This work is licensed under the Apache 2 license.
Android Development with Kotlin
RecyclerView.Adapter
● Supplies data and layouts that the RecyclerView displays
● A custom Adapter extends from RecyclerView.Adapter and
overrides these three functions:
● getItemCount
● onCreateViewHolder
● onBindViewHolder
45
This work is licensed under the Apache 2 license.
Android Development with Kotlin
View recycling in RecyclerView
46
If item is scrolled
offscreen, it isn’t
destroyed. Item is put in
a pool to be recycled.
onBindViewHolder binds
the view with the new
values, and then the view
gets reinserted in the list.
Mountain View, California
Miami, Florida
Seattle, Washington
Reno, Nevada
Nashville, Tennessee
Little Rock, Arkansas
Boston, Massachusetts
Chicago, Illinois
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Add RecyclerView to your layout
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
47
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Create a list item layout
res/layout/item_view.xml
48
<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>
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Create a list adapter
class MyAdapter(val data: List<Int>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>()
{
49
class MyViewHolder(val row: View) : RecyclerView.ViewHolder(row) {
val textView = row.findViewById<TextView>(R.id.number)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val layout = LayoutInflater.from(parent.context).inflate(R.layout.item_view,
parent, false)
return MyViewHolder(layout)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.textView.text = data.get(position).toString()
}
override fun getItemCount(): Int = data.size
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Set the adapter on the RecyclerView
In MainActivity.kt:
50
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rv: RecyclerView = findViewById(R.id.rv)
rv.layoutManager = LinearLayoutManager(this)
rv.adapter = MyAdapter(IntRange(0, 100).toList())
}
This work is licensed under the Apache 2 license.
Android Development with Kotlin 51
Summary
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Summary
In Lesson 5, you learned how to:
● Specify lengths in dp for your layout
● Work with screen densities for different Android devices
● Render Views to the screen of your app
● Layout views within a ConstraintLayout using constraints
● Simplify getting View references from layout with data binding
● Display a list of text items using a RecyclerView and custom adapter
52
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Learn more
● Pixel density on Android
● Spacing
● Device metrics
● Type scale
● Build a Responsive UI with ConstraintLayout
● Data Binding Library
● Create dynamic lists with RecyclerView
53
This work is licensed under the Apache 2 license.
Android Development with Kotlin
Pathway
54
Practice what you’ve learned by
completing the pathway:
Lesson 5: Layouts

More Related Content

Similar to Lesson 5 Layouts.pptx

Android app development SEO Expert Bangladesh LTD.pdf
Android app development  SEO Expert Bangladesh LTD.pdfAndroid app development  SEO Expert Bangladesh LTD.pdf
Android app development SEO Expert Bangladesh LTD.pdf
Tasnim Jahan
 
Kotlin で android アプリを作ってみた
Kotlin で android アプリを作ってみたKotlin で android アプリを作ってみた
Kotlin で android アプリを作ってみた
bina1204 Hozuki
 

Similar to Lesson 5 Layouts.pptx (20)

Android app development SEO Expert Bangladesh LTD.pdf
Android app development  SEO Expert Bangladesh LTD.pdfAndroid app development  SEO Expert Bangladesh LTD.pdf
Android app development SEO Expert Bangladesh LTD.pdf
 
Compose Camp 1.pdf
Compose Camp 1.pdfCompose Camp 1.pdf
Compose Camp 1.pdf
 
Kotlin Basics & Introduction to Jetpack Compose.pptx
Kotlin Basics & Introduction to Jetpack Compose.pptxKotlin Basics & Introduction to Jetpack Compose.pptx
Kotlin Basics & Introduction to Jetpack Compose.pptx
 
Introduction to android applications stu
Introduction to android applications stuIntroduction to android applications stu
Introduction to android applications stu
 
Introduction to android study jams
Introduction to  android study jamsIntroduction to  android study jams
Introduction to android study jams
 
DSC ASEB Android Study Jams 2020: New to Programming 3
DSC ASEB Android Study Jams 2020: New to Programming 3DSC ASEB Android Study Jams 2020: New to Programming 3
DSC ASEB Android Study Jams 2020: New to Programming 3
 
What's new in android 4.4 - Romain Guy & Chet Haase
What's new in android 4.4 - Romain Guy & Chet HaaseWhat's new in android 4.4 - Romain Guy & Chet Haase
What's new in android 4.4 - Romain Guy & Chet Haase
 
Android NDK: Entrando no Mundo Nativo
Android NDK: Entrando no Mundo NativoAndroid NDK: Entrando no Mundo Nativo
Android NDK: Entrando no Mundo Nativo
 
PluginandPlay_DevoxxBE.pptx
PluginandPlay_DevoxxBE.pptxPluginandPlay_DevoxxBE.pptx
PluginandPlay_DevoxxBE.pptx
 
Android ndk: Entering the native world
Android ndk: Entering the native worldAndroid ndk: Entering the native world
Android ndk: Entering the native world
 
pluginandplay-UtrechtJUG.pptx
pluginandplay-UtrechtJUG.pptxpluginandplay-UtrechtJUG.pptx
pluginandplay-UtrechtJUG.pptx
 
14.1 Architecture Components.pptx
14.1 Architecture Components.pptx14.1 Architecture Components.pptx
14.1 Architecture Components.pptx
 
Innovation Generation - The Mobile Meetup: Android Best Practices
Innovation Generation - The Mobile Meetup: Android Best PracticesInnovation Generation - The Mobile Meetup: Android Best Practices
Innovation Generation - The Mobile Meetup: Android Best Practices
 
Kotlin で android アプリを作ってみた
Kotlin で android アプリを作ってみたKotlin で android アプリを作ってみた
Kotlin で android アプリを作ってみた
 
Aws Deployment Tools - Overview, Details, Implementation
Aws Deployment Tools - Overview, Details, ImplementationAws Deployment Tools - Overview, Details, Implementation
Aws Deployment Tools - Overview, Details, Implementation
 
Week 7
Week 7Week 7
Week 7
 
Android study jams info session 2021 new GDSC GECBSP
Android study jams info session 2021 new GDSC GECBSPAndroid study jams info session 2021 new GDSC GECBSP
Android study jams info session 2021 new GDSC GECBSP
 
Android Study Jams Info Session 2021 | GDSC IIITA
Android Study Jams Info Session 2021 | GDSC IIITAAndroid Study Jams Info Session 2021 | GDSC IIITA
Android Study Jams Info Session 2021 | GDSC IIITA
 
Rhomobile 5.5 Release Notes
Rhomobile 5.5 Release NotesRhomobile 5.5 Release Notes
Rhomobile 5.5 Release Notes
 
Final session 1
Final session 1Final session 1
Final session 1
 

Recently uploaded

reStartEvents 5:9 DC metro & Beyond V-Career Fair Employer Directory.pdf
reStartEvents 5:9 DC metro & Beyond V-Career Fair Employer Directory.pdfreStartEvents 5:9 DC metro & Beyond V-Career Fair Employer Directory.pdf
reStartEvents 5:9 DC metro & Beyond V-Career Fair Employer Directory.pdf
Ken Fuller
 
一比一原版(毕业证书)意大利米兰理工大学毕业证学位证可查学历认证
一比一原版(毕业证书)意大利米兰理工大学毕业证学位证可查学历认证一比一原版(毕业证书)意大利米兰理工大学毕业证学位证可查学历认证
一比一原版(毕业证书)意大利米兰理工大学毕业证学位证可查学历认证
epodumf6
 
Vip Mumbai Call Girls Ghatkopar Call On 9920725232 With Body to body massage ...
Vip Mumbai Call Girls Ghatkopar Call On 9920725232 With Body to body massage ...Vip Mumbai Call Girls Ghatkopar Call On 9920725232 With Body to body massage ...
Vip Mumbai Call Girls Ghatkopar Call On 9920725232 With Body to body massage ...
amitlee9823
 
Call Girls In Kengeri Satellite Town ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Kengeri Satellite Town ☎ 7737669865 🥵 Book Your One night StandCall Girls In Kengeri Satellite Town ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Kengeri Satellite Town ☎ 7737669865 🥵 Book Your One night Stand
amitlee9823
 
Virgin Call Girls Delhi Service-oriented sexy call girls ☞ 9899900591 ☜ Rita ...
Virgin Call Girls Delhi Service-oriented sexy call girls ☞ 9899900591 ☜ Rita ...Virgin Call Girls Delhi Service-oriented sexy call girls ☞ 9899900591 ☜ Rita ...
Virgin Call Girls Delhi Service-oriented sexy call girls ☞ 9899900591 ☜ Rita ...
poojakaurpk09
 
Call Girls Hosur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Hosur Just Call 👗 7737669865 👗 Top Class Call Girl Service BangaloreCall Girls Hosur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Hosur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
amitlee9823
 
Call Girls Bidadi Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Bidadi Just Call 👗 7737669865 👗 Top Class Call Girl Service BangaloreCall Girls Bidadi Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Bidadi Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
amitlee9823
 
Call Girls Bidadi ☎ 7737669865☎ Book Your One night Stand (Bangalore)
Call Girls Bidadi ☎ 7737669865☎ Book Your One night Stand (Bangalore)Call Girls Bidadi ☎ 7737669865☎ Book Your One night Stand (Bangalore)
Call Girls Bidadi ☎ 7737669865☎ Book Your One night Stand (Bangalore)
amitlee9823
 
Jual obat aborsi Jakarta ( 085657271886 )Cytote pil telat bulan penggugur kan...
Jual obat aborsi Jakarta ( 085657271886 )Cytote pil telat bulan penggugur kan...Jual obat aborsi Jakarta ( 085657271886 )Cytote pil telat bulan penggugur kan...
Jual obat aborsi Jakarta ( 085657271886 )Cytote pil telat bulan penggugur kan...
ZurliaSoop
 
Nagavara Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore Es...
Nagavara Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore Es...Nagavara Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore Es...
Nagavara Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore Es...
amitlee9823
 
Dombivli Call Girls, 9892124323, Kharghar Call Girls, chembur Call Girls, Vas...
Dombivli Call Girls, 9892124323, Kharghar Call Girls, chembur Call Girls, Vas...Dombivli Call Girls, 9892124323, Kharghar Call Girls, chembur Call Girls, Vas...
Dombivli Call Girls, 9892124323, Kharghar Call Girls, chembur Call Girls, Vas...
Pooja Nehwal
 
Gabriel_Carter_EXPOLRATIONpp.pptx........
Gabriel_Carter_EXPOLRATIONpp.pptx........Gabriel_Carter_EXPOLRATIONpp.pptx........
Gabriel_Carter_EXPOLRATIONpp.pptx........
deejay178
 

Recently uploaded (20)

reStartEvents 5:9 DC metro & Beyond V-Career Fair Employer Directory.pdf
reStartEvents 5:9 DC metro & Beyond V-Career Fair Employer Directory.pdfreStartEvents 5:9 DC metro & Beyond V-Career Fair Employer Directory.pdf
reStartEvents 5:9 DC metro & Beyond V-Career Fair Employer Directory.pdf
 
Dubai Call Girls Kiki O525547819 Call Girls Dubai Koko
Dubai Call Girls Kiki O525547819 Call Girls Dubai KokoDubai Call Girls Kiki O525547819 Call Girls Dubai Koko
Dubai Call Girls Kiki O525547819 Call Girls Dubai Koko
 
Hot Call Girls |Delhi |Janakpuri ☎ 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Janakpuri ☎ 9711199171 Book Your One night StandHot Call Girls |Delhi |Janakpuri ☎ 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Janakpuri ☎ 9711199171 Book Your One night Stand
 
一比一原版(毕业证书)意大利米兰理工大学毕业证学位证可查学历认证
一比一原版(毕业证书)意大利米兰理工大学毕业证学位证可查学历认证一比一原版(毕业证书)意大利米兰理工大学毕业证学位证可查学历认证
一比一原版(毕业证书)意大利米兰理工大学毕业证学位证可查学历认证
 
Vip Mumbai Call Girls Ghatkopar Call On 9920725232 With Body to body massage ...
Vip Mumbai Call Girls Ghatkopar Call On 9920725232 With Body to body massage ...Vip Mumbai Call Girls Ghatkopar Call On 9920725232 With Body to body massage ...
Vip Mumbai Call Girls Ghatkopar Call On 9920725232 With Body to body massage ...
 
Call Girls In Kengeri Satellite Town ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Kengeri Satellite Town ☎ 7737669865 🥵 Book Your One night StandCall Girls In Kengeri Satellite Town ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Kengeri Satellite Town ☎ 7737669865 🥵 Book Your One night Stand
 
Joshua Minker Brand Exploration Sports Broadcaster .pptx
Joshua Minker Brand Exploration Sports Broadcaster .pptxJoshua Minker Brand Exploration Sports Broadcaster .pptx
Joshua Minker Brand Exploration Sports Broadcaster .pptx
 
Virgin Call Girls Delhi Service-oriented sexy call girls ☞ 9899900591 ☜ Rita ...
Virgin Call Girls Delhi Service-oriented sexy call girls ☞ 9899900591 ☜ Rita ...Virgin Call Girls Delhi Service-oriented sexy call girls ☞ 9899900591 ☜ Rita ...
Virgin Call Girls Delhi Service-oriented sexy call girls ☞ 9899900591 ☜ Rita ...
 
Rearing technique of lac insect and their management
Rearing technique of lac insect and their managementRearing technique of lac insect and their management
Rearing technique of lac insect and their management
 
Call Girls Hosur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Hosur Just Call 👗 7737669865 👗 Top Class Call Girl Service BangaloreCall Girls Hosur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Hosur Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
 
Call Girls Bidadi Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Bidadi Just Call 👗 7737669865 👗 Top Class Call Girl Service BangaloreCall Girls Bidadi Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Bidadi Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
 
Pooja 9892124323, Call girls Services and Mumbai Escort Service Near Hotel Sa...
Pooja 9892124323, Call girls Services and Mumbai Escort Service Near Hotel Sa...Pooja 9892124323, Call girls Services and Mumbai Escort Service Near Hotel Sa...
Pooja 9892124323, Call girls Services and Mumbai Escort Service Near Hotel Sa...
 
Call Girls Alandi Road Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Alandi Road Call Me 7737669865 Budget Friendly No Advance BookingCall Girls Alandi Road Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Alandi Road Call Me 7737669865 Budget Friendly No Advance Booking
 
TEST BANK For Evidence-Based Practice for Nurses Appraisal and Application of...
TEST BANK For Evidence-Based Practice for Nurses Appraisal and Application of...TEST BANK For Evidence-Based Practice for Nurses Appraisal and Application of...
TEST BANK For Evidence-Based Practice for Nurses Appraisal and Application of...
 
Call Girls Bidadi ☎ 7737669865☎ Book Your One night Stand (Bangalore)
Call Girls Bidadi ☎ 7737669865☎ Book Your One night Stand (Bangalore)Call Girls Bidadi ☎ 7737669865☎ Book Your One night Stand (Bangalore)
Call Girls Bidadi ☎ 7737669865☎ Book Your One night Stand (Bangalore)
 
Toxicokinetics studies.. (toxicokinetics evaluation in preclinical studies)
Toxicokinetics studies.. (toxicokinetics evaluation in preclinical studies)Toxicokinetics studies.. (toxicokinetics evaluation in preclinical studies)
Toxicokinetics studies.. (toxicokinetics evaluation in preclinical studies)
 
Jual obat aborsi Jakarta ( 085657271886 )Cytote pil telat bulan penggugur kan...
Jual obat aborsi Jakarta ( 085657271886 )Cytote pil telat bulan penggugur kan...Jual obat aborsi Jakarta ( 085657271886 )Cytote pil telat bulan penggugur kan...
Jual obat aborsi Jakarta ( 085657271886 )Cytote pil telat bulan penggugur kan...
 
Nagavara Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore Es...
Nagavara Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore Es...Nagavara Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore Es...
Nagavara Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore Es...
 
Dombivli Call Girls, 9892124323, Kharghar Call Girls, chembur Call Girls, Vas...
Dombivli Call Girls, 9892124323, Kharghar Call Girls, chembur Call Girls, Vas...Dombivli Call Girls, 9892124323, Kharghar Call Girls, chembur Call Girls, Vas...
Dombivli Call Girls, 9892124323, Kharghar Call Girls, chembur Call Girls, Vas...
 
Gabriel_Carter_EXPOLRATIONpp.pptx........
Gabriel_Carter_EXPOLRATIONpp.pptx........Gabriel_Carter_EXPOLRATIONpp.pptx........
Gabriel_Carter_EXPOLRATIONpp.pptx........
 

Lesson 5 Layouts.pptx

  • 1. This work is licensed under the Apache 2 license. This work is licensed under the Apache 2 license. Android Development with Kotlin v1.0 1 Lesson 5: Layouts
  • 2. This work is licensed under the Apache 2 license. Android Development with Kotlin About this lesson Lesson 5: Layouts ● Layouts in Android ● ConstraintLayout ● Additional topics for ConstraintLayout ● Data binding ● Displaying lists with RecyclerView ● Summary 2
  • 3. This work is licensed under the Apache 2 license. Android Development with Kotlin 3 Layouts in Android
  • 4. This work is licensed under the Apache 2 license. Android Development with Kotlin Android devices 4 ● Android devices come in many different form factors. ● More and more pixels per inch are being packed into device screens. ● Developers need the ability to specify layout dimensions that are consistent across devices.
  • 5. This work is licensed under the Apache 2 license. Android Development with Kotlin Density-independent pixels (dp) ● Density-independent pixels (dp) take screen density into account. ● Android views are measured in density-independent pixels. ● dp = (width in pixels * 160) screen density 5 80dp 160dp Use dp when specifying sizes in your layout, such as the width or height of views. Hello
  • 6. This work is licensed under the Apache 2 license. Android Development with Kotlin Screen-density buckets 6 Density qualifier Description DPI estimate ldpi (mostly unused) Low density ~120dpi mdpi (baseline density) Medium density ~160dpi hdpi High density ~240dpi xhdpi Extra-high density ~320dpi xxhdpi Extra-extra-high density ~480dpi xxxhdpi Extra-extra-extra-high density ~640dpi
  • 7. This work is licensed under the Apache 2 license. Android Development with Kotlin Android View rendering cycle 7 Measure Layout Draw
  • 8. This work is licensed under the Apache 2 license. Android Development with Kotlin Drawing region 8 What we see: How it's drawn:
  • 9. This work is licensed under the Apache 2 license. Android Development with Kotlin View margins and padding 9 View with margin View with margin and padding View View View
  • 10. This work is licensed under the Apache 2 license. Android Development with Kotlin 10 ConstraintLayout
  • 11. This work is licensed under the Apache 2 license. Android Development with Kotlin Deeply nested layouts are costly ● Deeply nested ViewGroups require more computation ● Views may be measured multiple times ● Can cause UI slowdown and lack of responsiveness 11 Use ConstraintLayout to avoid some of these issues!
  • 12. This work is licensed under the Apache 2 license. Android Development with Kotlin What is ConstraintLayout? ● Recommended default layout for Android ● Solves costly issue of too many nested layouts, while allowing complex behavior ● Position and size views within it using a set of constraints 12
  • 13. This work is licensed under the Apache 2 license. Android Development with Kotlin What is a constraint? A restriction or limitation on the properties of a View that the layout attempts to respect 13
  • 14. This work is licensed under the Apache 2 license. Android Development with Kotlin Relative positioning constraints Can set up a constraint relative to the parent container Format: layout_constraint<SourceConstraint>_to<TargetConstraint>Of 14 Example attributes on a TextView: app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toLeftOf="parent"
  • 15. This work is licensed under the Apache 2 license. Android Development with Kotlin Relative positioning constraints 15 Hello! Top Bottom Baseline
  • 16. This work is licensed under the Apache 2 license. Android Development with Kotlin Relative positioning constraints 16 Start Left Right End Hello!
  • 17. This work is licensed under the Apache 2 license. Android Development with Kotlin Simple ConstraintLayout example <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> 17
  • 18. This work is licensed under the Apache 2 license. Android Development with Kotlin Layout Editor in Android Studio You can click and drag to add constraints to a View. 18
  • 19. This work is licensed under the Apache 2 license. Android Development with Kotlin Constraint Widget in Layout Editor 19 Fixed Wrap content Match constraints
  • 20. This work is licensed under the Apache 2 license. Android Development with Kotlin Wrap content for width and height 20
  • 21. This work is licensed under the Apache 2 license. Android Development with Kotlin Wrap content for width, fixed height 21
  • 22. This work is licensed under the Apache 2 license. Android Development with Kotlin Center a view horizontally 22
  • 23. This work is licensed under the Apache 2 license. Android Development with Kotlin Use match_constraint 23 Can’t use match_parent on a child view, use match_constraint instead
  • 24. This work is licensed under the Apache 2 license. Android Development with Kotlin Chains ● Let you position views in relation to each other ● Can be linked horizontally or vertically ● Provide much of LinearLayout functionality 24
  • 25. This work is licensed under the Apache 2 license. Android Development with Kotlin Create a Chain in Layout Editor 1. Select the objects you want to be in the chain. 2. Right-click and select Chains. 3. Create a horizontal or vertical chain. 25
  • 26. This work is licensed under the Apache 2 license. Android Development with Kotlin Chain styles Adjust space between views with these different chain styles. 26 Spread Chain Spread Inside Chain Weighted Chain Packed Chain
  • 27. This work is licensed under the Apache 2 license. Android Development with Kotlin 27 Additional topics for ConstraintLayout
  • 28. This work is licensed under the Apache 2 license. Android Development with Kotlin Guidelines ● Let you position multiple views relative to a single guide ● Can be vertical or horizontal ● Allow for greater collaboration with design/UX teams ● Aren't drawn on the device 28
  • 29. This work is licensed under the Apache 2 license. Android Development with Kotlin Guidelines in Android Studio 29
  • 30. This work is licensed under the Apache 2 license. Android Development with Kotlin Example Guideline <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> 30
  • 31. This work is licensed under the Apache 2 license. Android Development with Kotlin Creating Guidelines ● layout_constraintGuide_begin ● layout_constraintGuide_end ● layout_constraintGuide_percent 31
  • 32. This work is licensed under the Apache 2 license. Android Development with Kotlin Groups ● Control the visibility of a set of widgets ● Group visibility can be toggled in code 32
  • 33. This work is licensed under the Apache 2 license. Android Development with Kotlin Example 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"/> 33
  • 34. This work is licensed under the Apache 2 license. Android Development with Kotlin Groups app code 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) } } 34
  • 35. This work is licensed under the Apache 2 license. Android Development with Kotlin 35 Data binding
  • 36. This work is licensed under the Apache 2 license. Android Development with Kotlin Current approach: findViewById() Traverses the View hierarchy each time 36 val name = findViewById(...) val age = findViewById(...) val loc = findViewById(...) name.text = … age.text = … loc.text = … <ConstraintLayout … > <TextView android:id="@+id/name"/> <TextView android:id="@+id/age"/> <TextView android:id="@+id/loc"/> </ConstraintLayout> findViewById MainActivity.kt activity_main.xml findViewById findViewById
  • 37. This work is licensed under the Apache 2 license. Android Development with Kotlin Use data binding instead Bind UI components in your layouts to data sources in your app. 37 activity_main.xml MainActivity.kt Val binding:ActivityMainBinding binding.name.text = … binding.age.text = … binding.loc.text = … <layout> <ConstraintLayout … > <TextView android:id="@+id/name"/> <TextView android:id="@+id/age"/> <TextView android:id="@+id/loc"/> </ConstraintLayout> </layout> initialize binding
  • 38. This work is licensed under the Apache 2 license. Android Development with Kotlin Modify build.gradle file android { ... buildFeatures { dataBinding true } } 38
  • 39. This work is licensed under the Apache 2 license. Android Development with Kotlin Add layout tag <layout> <androidx.constraintlayout.widget.ConstraintLayout> <TextView ... android:id="@+id/username" /> <EditText ... android:id="@+id/password" /> </androidx.constraintlayout.widget.ConstraintLayout> </layout> 39
  • 40. This work is licensed under the Apache 2 license. Android Development with Kotlin Layout inflation with data binding Replace this 40 setContentView(R.layout.activity_main) with this val binding: ActivityMainBinding = DataBindingUtil.setContentView( this, R.layout.activity_main) binding.username = "Melissa"
  • 41. This work is licensed under the Apache 2 license. Android Development with Kotlin Data binding layout variables <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> 41 In MainActivity.kt: binding.name = "John"
  • 42. This work is licensed under the Apache 2 license. Android Development with Kotlin Data binding layout expressions <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> 42
  • 43. This work is licensed under the Apache 2 license. Android Development with Kotlin 43 Displaying lists with RecyclerView
  • 44. This work is licensed under the Apache 2 license. Android Development with Kotlin RecyclerView ● Widget for displaying lists of data ● "Recycles" (reuses) item views to make scrolling more performant ● Can specify a list item layout for each item in the dataset ● Supports animations and transitions 44
  • 45. This work is licensed under the Apache 2 license. Android Development with Kotlin RecyclerView.Adapter ● Supplies data and layouts that the RecyclerView displays ● A custom Adapter extends from RecyclerView.Adapter and overrides these three functions: ● getItemCount ● onCreateViewHolder ● onBindViewHolder 45
  • 46. This work is licensed under the Apache 2 license. Android Development with Kotlin View recycling in RecyclerView 46 If item is scrolled offscreen, it isn’t destroyed. Item is put in a pool to be recycled. onBindViewHolder binds the view with the new values, and then the view gets reinserted in the list. Mountain View, California Miami, Florida Seattle, Washington Reno, Nevada Nashville, Tennessee Little Rock, Arkansas Boston, Massachusetts Chicago, Illinois
  • 47. This work is licensed under the Apache 2 license. Android Development with Kotlin Add RecyclerView to your layout <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"/> 47
  • 48. This work is licensed under the Apache 2 license. Android Development with Kotlin Create a list item layout res/layout/item_view.xml 48 <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>
  • 49. This work is licensed under the Apache 2 license. Android Development with Kotlin Create a list adapter class MyAdapter(val data: List<Int>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() { 49 class MyViewHolder(val row: View) : RecyclerView.ViewHolder(row) { val textView = row.findViewById<TextView>(R.id.number) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { val layout = LayoutInflater.from(parent.context).inflate(R.layout.item_view, parent, false) return MyViewHolder(layout) } override fun onBindViewHolder(holder: MyViewHolder, position: Int) { holder.textView.text = data.get(position).toString() } override fun getItemCount(): Int = data.size
  • 50. This work is licensed under the Apache 2 license. Android Development with Kotlin Set the adapter on the RecyclerView In MainActivity.kt: 50 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val rv: RecyclerView = findViewById(R.id.rv) rv.layoutManager = LinearLayoutManager(this) rv.adapter = MyAdapter(IntRange(0, 100).toList()) }
  • 51. This work is licensed under the Apache 2 license. Android Development with Kotlin 51 Summary
  • 52. This work is licensed under the Apache 2 license. Android Development with Kotlin Summary In Lesson 5, you learned how to: ● Specify lengths in dp for your layout ● Work with screen densities for different Android devices ● Render Views to the screen of your app ● Layout views within a ConstraintLayout using constraints ● Simplify getting View references from layout with data binding ● Display a list of text items using a RecyclerView and custom adapter 52
  • 53. This work is licensed under the Apache 2 license. Android Development with Kotlin Learn more ● Pixel density on Android ● Spacing ● Device metrics ● Type scale ● Build a Responsive UI with ConstraintLayout ● Data Binding Library ● Create dynamic lists with RecyclerView 53
  • 54. This work is licensed under the Apache 2 license. Android Development with Kotlin Pathway 54 Practice what you’ve learned by completing the pathway: Lesson 5: Layouts

Editor's Notes

  1. Android devices come in a number of different sizes and form factors spanning mobile phones, tablets, watches, and more. Without an adaptable system to refer to sizes, it would be hard to know what to expect across different devices.
  2. Unlike physical pixels (px), density-independent pixels take screen density (pixels per inch) into account. Using dp and adaptive layouts like ConstraintLayout, which we’ll cover shortly, you ensure that your design and layout will work well across different devices. A dp is computed by the formula shown above. Resource: Pixel density on Android
  3. Screens are organized in several density buckets, from low density (~120 dpi), up to extra-extra-extra-high density(~640dpi). Most consumer devices currently fall between hdpi and xxxhdpi, with flagship phones on the high end. Although using dp ensures that your layouts work well in most cases, you should still check your app on devices in different density buckets. You can test multiple devices with the emulator. Resources: Support different pixel densities Device Metrics
  4. When Android draws information on the screen, three distinct passes happen in quick succession: Measure pass - calculate the precise dimensions of each View, including expensive operations like wrap_contents you used. Layout pass - align views based on the rules of the layout manager. Draw - render the results based on the previous two steps.
  5. No matter the shape of a widget, when it comes to drawing it on-screen, the draw calls are bounded by rectangles, which serve as an invisible border to the View.
  6. You can add whitespace between views by adding padding, and/or a margin. Padding adjusts the amount of space inside that invisible border, but the View doesn’t change its relationship to other views. Margin, on the other hand, determines the amount of external space between a View and other views around it.
  7. Transition: 1 click Placing views in ViewGroups, like LinearLayout, can help you organize your layout. If you nest too many layouts within each other, however, you can make your UI unresponsive to user input. That’s because every element on the screen has to be measured precisely before it can be drawn. If drawing an element depends on other elements, a particular View may have to be measured several times. To avoid this, one solution is to use ConstraintLayout.
  8. ConstraintLayout mitigates many of the previous issues we’ve talked about. It duplicates all the functionality of LinearLayout and RelativeLayout, while allowing the developer to make the layout flatter with less hierarchy and nesting. Less nesting means being able to measure, layout, and draw views in less passes, thus increasing the speed of displaying the UI. ConstraintLayout’s most important way of doing this is through constraints. Resources: Build a Responsive UI with ConstraintLayout
  9. Behind the scenes, the solver is taking all the constraints into account, deciding how to break ties if constraints conflict, and determining the final position and dimensions of elements. For example, in the diagram, B is constrained to always be to the right of A, and C is constrained below A.
  10. You’ll see many constraints in this general form. Parent refers to the enclosing container, which is the ConstraintLayout. If you set these example attributes in a TextView within a ConstraintLayout, it would appear in the Design view like the preview on the right. In this case, the source is the current TextView, while target is the Parent container. This first constraint says "I want to align the top of this TextView to the top of the parent layout." The second constraint says "I want to align the left of this TextView to the left of the parent layout." Note that there’s also a top and left margin of 16dp on this TextView.
  11. Starting in the vertical direction, we can add a constraint to the top or bottom of an element, or to the text’s baseline if the View contains text.
  12. Horizontally, we can constrain the start and end edges of a View. Left and right are included for completion, but as a best practice, you should default to start and end. This is so that the layout still works well if your app is translated to other languages, such as those with right-to-left (RTL) scripts. Thus, if you want to specify a left constraint, use start constraint instead. If you want to specify a right constraint, use end constraint instead. Resource: Update existing resources
  13. Here are some constraints you might see in an app. In this example, we have a ConstraintLayout containing one child TextView, which has top, bottom, start, and end constraints.
  14. You can create a constraint by editing the XML of a layout (as shown in previous slides), or by using Android Studio’s Layout Editor. In the Layout Editor, every View in a ConstraintLayout is shown with four circular handles to quickly constrain this View to the start, end, top, and bottom of other views. In this case, we’ve created a layout_constraint Start to the Start of the parent, and End to the End of the parent. By default, these two constraints act equally on the object. That is, they have an equal constraint bias (50% on each side by default), so the object ends up centered. You can adjust the bias by dragging the bias slider in the Attributes window to pull the View to either side.
  15. In the Layout Editor, you’ll see the Constraint Widget in the Attributes Window at the right of the screen. You’ll see three types of symbols (shown above), indicating which type of constraint has been placed on the start, end, top, and bottom of the currently selected View. Let’s zoom in with a stylized and simplified Constraints Widget to understand constraints. Resource: Adjust the view size
  16. The square to the right represents a view with wrap_content on its height and width.
  17. There’s also a different symbol resembling a pipe that indicates that dimension has a fixed size in dp (48dp) for the height of the View. The width of the View is wrap_content as in the previous slide.
  18. We can have multiple constraints on a View that determine how much they will affect the final position. In this case, there are start and end constraints on the View in the horizontal direction. There’s also a bias of 50 (notice the gray slider in the callout), so the constraints are equally applied. The end result is that the View is centered horizontally within the parent. Resource: Adjust the constraint bias
  19. In LinearLayout, we used match_parent to indicate that we wanted a view to take up as much space as was available to it. In ConstraintLayout, we can't use match_parent on a child view, so instead we use match_constraint. Depending on your version of Android Studio, you may see this as 0dp (match_constraint).
  20. You can also create chains within a ConstraintLayout. A chain is a group of views that are linked to each other with bi-directional position constraints. Resource: Chains in ConstraintLayout
  21. Within the Layout Editor, follow these three steps to create a chain.
  22. Chains can be styled in a number of ways, as shown above. More details on each style can be found in the resource linked below. Resource: Chains in ConstraintLayout
  23. Here are some additional topics that you may find useful when using the ConstraintLayout.
  24. You can position multiple views relative to a guideline within a ConstraintLayout. Guidelines are not displayed on the device, and are only used for layout purposes. Resource: Guideline
  25. This is how guidelines appear in Android Studio. You can adjust them in code, or by clicking and dragging. Views that are constrained to a guideline will adjust themselves when you adjust the guideline.
  26. Here’s an example where this TextView is constrained to a vertical Guideline.
  27. You can set guidelines by a specific number of dp from the "begin" or "end" of a layout, or by a numeric percent between 0 and 1 (e.g., 0.05).
  28. Resource: Group
  29. Data binding is an important concept that we’ll be revisiting several times as this course goes on. It can simplify your code and make your code more robust. Let’s look at a couple of use cases.
  30. Within your Activity code, you could use findViewById() to find View instances. However, IDs are global to all layouts, so you can end up with runtime crashes if you reference an ID that isn't actually in the current layout.
  31. Instead, use data binding to simplify your code and catch bugs at compile time by having type safety with the views you’re accessing. In this example, we initialize a binding object specifically for the main activity layout and can access the views immediately, rather than having to call findViewById individually. On the binding object instance, you can access the name, age, and location TextViews (e.g., binding.name) and change the text within them (e.g., binding.name.text). This is possible because name, age, and loc are the resource ID names that were declared on the TextViews in the XML layout. Let’s look at how to modify our app to use data binding.
  32. To begin, we add the displayed code to the android section in our build.gradle file. This indicates to Gradle that it should generate some classes for us when we mark a layout in XML.
  33. Next, we add a layout tag. When we enclose a layout in a layout tag, we are indicating that we want a binding class created for us. The binding class will contain references to any views that have a resource ID.
  34. In our Activity, instead of calling setContentView() from the Activity, we call DataBindingUtil.setContentView() and pass the Activity(this) and resource ID of the desired layout. The resulting binding variable will have access to the previously named views. Notice that we didn’t have to call findViewById before accessing our views (such as the username TextView).
  35. Transition: 1 click Instead of modifying the binding values in code, we can set them in the layout. At the top of this layout XML, we insert the data tag to declare that the layout will have access to a String variable called name. Then we use that name variable as the text to display in the TextView. In the activity code, we set the text of the TextView by setting the name value on the binding object. Resource: Layouts and binding expressions
  36. Expression language lets you do many things in a single line of code, such as simple transformations, displaying content based on a comparison, or accessing the content of other views. In this case, we call toUpperCase() on the name variable String. We’ll explore options for more complex transformations and binding to events later in the course. Check the resource below for more examples on the expressions you can create. Resource: Layouts and binding expressions
  37. A basic RecyclerView adapter will need to override the following three functions: getItemCount returns the total number of items available in your list of data onCreateViewHolder is called to create a new list item layout onBindViewHolder is called when reusing a list item layout by updating the data that’s displayed within it A ViewHolder represents a list item layout and has references to all the views within the list item layout. Resources: RecyclerView.Adapter RecyclerView.ViewHolder
  38. When you have a large number of items in your list (greater than the amount of space on screen to display them all), don’t create a View for items that have not been scrolled to yet. The adapter’s onCreateViewHolder() method is called to create view holders for the number of items that can be displayed on the screen at one time. After that initial creation, when you scroll, the system removes offscreen list item views from the hierarchy, and calls onBindViewHolder() on the adapter to “recycle” the list item views and use them again. The values within the list item view are updated to reflect the data in the new list item (that’s about to appear on screen), and the list item view is added back to the view hierarchy. Let’s look at the code for how to add a RecyclerView to your app.
  39. First, add the RecyclerView element to your layout. For example, if your app only has one Activity, include the RecyclerView in the layout XML file for that Activity. Be sure to include the RecyclerView library as a dependency in your build.gradle file.
  40. Create a new layout file that represents a list item layout (in this case a FrameLayout that contains a single TextView). This list item layout is used for each entry in the list.
  41. Transitions: 3 clicks Next, create a list adapter to create list items for the RecyclerView. Create a new Adapter class (MyAdapter) that extends from RecyclerView.Adapter. Define a custom ViewHolder class that will hold the views in the layout for a single list item. Override the 3 methods from RecyclerView.Adapter class: onCreateViewHolder onBindViewHolder getItemCount
  42. Then make these changes in the MainActivity file. Find a reference to the RecyclerView in the layout. Set a Layout Manager on it. LinearLayoutManager or GridLayoutManager are standard ones provided for you, but you can define your own. Initialize an instance of your custom adapter, and set the adapter on the RecyclerView so that the adapter can populate the list items in the RecyclerView.