рдХреБрдЫ рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ, Google рдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ 3.6 рдХреИрдирд░реА 11 рдЬрд╛рд░реА рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдореБрдЦреНрдп рдирд╡рд╛рдЪрд╛рд░ рдерд╛ рд╡реНрдпреВ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ, рдЬрд┐рд╕реЗ рдордИ рдореЗрдВ Google I / O 2019 рдкрд░ рд╡рд╛рдкрд╕ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╡реНрдпреВ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдЬрдм рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рджреГрд╢реНрдп рдмрдВрдзрди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдЖрдЙрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХрдХреНрд╖рд╛рдПрдВ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЙрддреНрдкрдиреНрди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдорд╛рд░реНрдХрдЕрдк рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рднреА рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП android:id
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдХреИрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ
рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рджреГрд╢реНрдп рдмрдВрдзрди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ build.gradle
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
android { ... viewBinding { enabled = true } }
рдЖрдк рдпрд╣ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдорд╛рд░реНрдХрдЕрдк рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ tools:viewBindingIgnore="true"
рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ tools:viewBindingIgnore="true"
рд╡рд╛рдВрдЫрд┐рдд рдорд╛рд░реНрдХрдЕрдк рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░реВрдЯ рджреГрд╢реНрдп рдореЗрдВ tools:viewBindingIgnore="true"
ред
рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрдиреНрди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдорд╛рд░реНрдХрдЕрдк ( root
) рдХреЗ рдореВрд▓ рджреГрд╢реНрдп рдХрд╛ рд▓рд┐рдВрдХ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЖрдИрдбреА рд╡рд╛рд▓реЗ рд╕рднреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВред рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо "рдорд╛рд░реНрдХрдЕрдк рдлрд╝рд╛рдЗрд▓ рдирд╛рдо" рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдКрдВрдЯ рдорд╛рдорд▓реЗ + "рдмрд╛рдЗрдВрдбрд┐рдВрдЧ" рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рд░реНрдХрдЕрдк рдлрд╝рд╛рдЗрд▓ result_profile.xml
:
<LinearLayout ... > <TextView android:id="@+id/name" /> <ImageView android:cropToPadding="true" /> <Button android:id="@+id/button" android:background="@drawable/rounded_button" /> </LinearLayout>
ResultProfileBinding
рд╡рд░реНрдЧ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ 2 рдлрд╝реАрд▓реНрдб рд╣реЛрдВрдЧреЗ: TextView name
рдФрд░ Button button
ред ImageView
рдХреБрдЫ рднреА рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ id
рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ ResultProfileBinding
рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ getRoot()
рд╡рд┐рдзрд┐ рд╣реЛрдЧреА рдЬреЛ рдореВрд▓ LinearLayout
рд▓реМрдЯрд╛рддреА рд╣реИред
рдХреНрд▓рд╛рд╕ ResultProfileBinding
рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдЯреЗрдЯрд┐рдХ рдореЗрдердб ResultProfileBinding
inflate()
рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк Activity
рдореЗрдВ content view
рд░реВрдк рдореЗрдВ рд░реВрдЯ рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
private lateinit var binding: ResultProfileBinding @Override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) binding = ResultProfileBinding.inflate(layoutInflater) setContentView(binding.root) }
рдмрд╛рдж рдореЗрдВ binding
рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рд╕реЗ рдЕрдВрддрд░
рд╡реНрдпреВ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рдореБрдЦреНрдп рд▓рд╛рдн рд╣реИрдВ рдирд▓ рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реБрд░рдХреНрд╖рд╛ред
рдЙрд╕реА рд╕рдордп, рдпрджрд┐ рдХреБрдЫ рджреГрд╢реНрдп рдПрдХ рд▓реЗрдЖрдЙрдЯ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ ( layout-land
, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП), рддреЛ рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╡рд░реНрдЧ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ @Nullable
рдХреНрд╖реЗрддреНрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рд░реНрдХрдЕрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдХ рд╣реА рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдПрдХ рджреГрд╢реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рд▓рд┐рдП android.view.View
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реАрд▓реНрдб рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
(рдХреИрдирд░реА 11 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 3.6 рдореЗрдВ рдХрдо рд╕реЗ рдХрдо)
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрддреНрдкрдиреНрди рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдмрд╕реЗ рд╕рдВрднрд╡ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдХ Button
рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ рдПрдХ TextView
, рдЯрд╛рдЗрдк TextView
рдПрдХ рдХреНрд╖реЗрддреНрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ ( public class Button extends TextView
)ред
рд╡реНрдпреВ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдорд╛рд░реНрдХрдЕрдк рдФрд░ рдХреЛрдб рдХреЗ рдмреАрдЪ рдХреА рд╕рднреА рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЕрдирд╛рд╡рд╢реНрдпрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗрдЧрд╛ред
RecyclerView.ViewHolder
рдореЗрдВ рдЙрдкрдпреЛрдЧ
RecyclerView.ViewHolder
рд▓рд┐рдП рдПрдХ view
рдмрдирд╛рддреЗ рд╕рдордп рд╡реНрдпреВ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ:
class PersonViewHolder(private val itemPersonBinding: ItemPersonBinding) : RecyclerView.ViewHolder(itemPersonBinding.root) { fun bind(person: Person) { itemPersonBinding.name.text = person.name } }
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рддрд░рд╣ рдХреЗ ViewHolder
рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ViewHolder
рдереЛрдбрд╝рд╛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PersonViewHolder { val layoutInflater = LayoutInflater.from(parent.context) val itemPersonBinding = ItemPersonBinding.inflate(layoutInflater, parent, false) return PersonViewHolder(itemPersonBinding) }
рдпрд╣ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ рдпрджрд┐, RecyclerView.ViewHolder
рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп RecyclerView.ViewHolder
layoutInflater
inflate(...)
рд╡рд┐рдзрд┐ рдореЗрдВ layoutInflater
рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкрд╛рд░рд┐рдд parent
рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рдпрд╣рд╛рдБ рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╡реНрдпреВ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, view
findViewById()
рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм findViewById()
inflate()
рд╡рд┐рдзрд┐ inflate()
ред рдпрд╣ kotlin-android-extensions
рдкрд░ рдПрдХ рдлрд╛рдпрджрд╛ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреИрд╢рд┐рдВрдЧ рдХреЗрд╡рд▓ Activity
рдФрд░ Fragment
рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ RecyclerView.ViewHolder
рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡реНрдпреВ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЪреАрдЬ рд╣реИ рдЬреЛ рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдирд┐рд░реНрдорд╛рддрд╛ рдмрдЯрд░ рдирд╛рдЗрдл рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЙрдкрдХрд░рдг рдХрдИ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджрд┐рдпрд╛ рдерд╛ред