
рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдХреЛрдЯрд▓рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдерд╛ред рдореИрдВ рдХреБрдЫ рдирдпрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ рд╕реАрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред рдлрд┐рд░ рдореИрдВ рдЕрдирдХреЛ рдЖ рдЧрдпрд╛ред рдЙрд╕ рд╕рдордп рддрдХ, xml рдореЗрдВ UI рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рд╕реБрд╕реНрдд рдерд╛ред рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рдерд╛, рдмрд┐рдирд╛ WYSIWYG рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ xml рдорд╛рд░реНрдХрдЕрдкред рдХреЗрд╡рд▓ рдирдХрд╛рд░рд╛рддреНрдордХ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдПрдХ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдП рдмрд┐рдирд╛ рдпреВрдЖрдИ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдЕрдЬреАрдм рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХреНрд╕рдПрдордПрд▓ рдХреЛ рдПрдВрдХреЛ рд▓реЗрдЖрдЙрдЯ рдбреАрдПрд╕рдПрд▓ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рд╢рд╛рдВрдд рдХреНрд╖рдорддрд╛ рднреА рд╣реИред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдХрдореА рдкреНрд░рд▓реЗрдЦрди рдХреА рд▓рдЧрднрдЧ рдкреВрд░реНрдг рдХрдореА рд╣реИред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдореБрдЭреЗ рдЕрдХреНрд╕рд░ рд╕реНрд░реЛрдд рдкрд░ рдЧреМрд░ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, Anko Layouts рдФрд░ Anko Coroutines рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
Anko рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрд╡рдпрдВ 4 рд╕реНрд╡рддрдВрддреНрд░ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ:
- Anko рд▓реЗрдЖрдЙрдЯ - рдПрдХ рдпреВрдЖрдИ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред
- Anko рдХреЙрдордиреНрд╕ - рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдг рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдПрдБред
- Anko SQLite - SQLite рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
- рдХреЛрд░рдХреЛрдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Anko Coroutines рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдг рд╣реИрдВред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд┐рд░реНрдл рдПрдХ рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ:
implementation "org.jetbrains.anko:anko:$anko_version"
рдЬрд╣рд╛рдВ anko_version
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдкрд░ рдмрд┐рд▓реНрдб.рдЧреНрд░реЗрдб рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИ:
ext.anko_version='0.10.8'
рдЕрдирдХреЛ рд▓реЗрдЖрдЙрдЯ
Anko рд▓реЗрдЖрдЙрдЯ рдЖрдкрдХреЛ UI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ UI Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдореИрджрд╛рди рдкрд░ рдореБрдЦреНрдп рдЦрд┐рд▓рд╛рдбрд╝реА рдПрдХ рдПрдХрд▓ рдмрдирд╛рдПрдБ рджреГрд╢реНрдп рд╡рд┐рдзрд┐ рд╡рд╛рд▓рд╛ AnkoComponent<T>
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ AnkoComponent<T>
рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рджреГрд╢реНрдп рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реИ рдХрд┐ рд╕рдВрдкреВрд░реНрдг UI рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред AnkoContext<T>
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ ViewManager рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╣реЛрдЧрд╛ред
AnkoComponent<T>
рдХреИрд╕реЗ AnkoComponent<T>
рдЗрд╕рдХреА рдереЛрдбрд╝реА рд╕рдордЭ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЗрдП рд╣рдорд╛рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╕рд░рд▓ UI рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ UI рдХреА рдРрд╕реА "рдкреНрд░рддреНрдпрдХреНрд╖" рд╡рд░реНрддрдиреА рдХреЗрд╡рд▓ рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реА рд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рди akoView рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ addView рдкрджреНрдзрддрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ , рдФрд░ AnkoContextImpl<T>
рдХреЛ рд╕реНрд╡рдпрдВ setContentView = true
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
class AppActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) verticalLayout { lparams(matchParent, matchParent) gravity = Gravity.CENTER textView("Cool Anko TextView") { gravity = Gravity.CENTER } } }
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ TextView рдХреЗ рд▓рд┐рдП, рдСрдирдХреНрд░реИрдЯ рд╡рд┐рдзрд┐ рдЬрд▓реНрджреА рд╕реЗ рдПрдХ рдбрдВрдк рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧреАред рдЖрдЗрдП рдпреВрдЖрдИ рд╕реЗ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╡рд░реНрдЧ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдиреНрдп рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
class AppActivityUi: AnkoComponent<AppActivity> { override fun createView(ui: AnkoContext<AppActivity>): View = with(ui) { verticalLayout { lparams(matchParent, matchParent) gravity = Gravity.CENTER textView("Cool Anko TextView") { gravity = Gravity.CENTER } } } }
рдЕрдм, рд╣рдорд╛рд░реЗ рдпреВрдЖрдИ рдХреЛ рд╣рдорд╛рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
AppActivityUi().setContentView(this)
рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдпреВрдЖрдИ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реАрдзреЗ onCreateView рдЯреБрдХрдбрд╝рд╛ рд╡рд┐рдзрд┐ рд╕реЗ рдХреЙрд▓ рдХрд░рдХреЗ createView рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
class AppFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { return AppFragmentUi().createView(AnkoContext.create(requireContext(), this)) } }
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - AnkoContext<T>
ViewManager рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рдереА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рддреАрди рдореБрдЦреНрдп рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ рдЬреЛ AnkoContext<T>
ред рд╣рдо рдЙрдирдХрд╛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред
рдмрдирд╛рдиреЗ
fun <T> create(ctx: Context, owner: T, setContentView: Boolean = false): AnkoContext<T>
рдФрд░ рдЙрд╕рдХрд╛ рдЬреБрдбрд╝рд╡рд╛рдВ рднрд╛рдИ
fun create(ctx: Context, setContentView: Boolean = false): AnkoContext<Context>
рд╡рд╛рдкрд╕реА AnkoContextImpl<T>
ред
рд╕рднреА рдорд╛рдирдХ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧрддрд┐рд╡рд┐рдзрд┐ рдФрд░ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВред рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдорд╛рд▓рд┐рдХ рдФрд░ setContentView рд╡рд┐рдХрд▓реНрдкред рдкрд╣рд▓рд╛ рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ, рдЧрддрд┐рд╡рд┐рдзрд┐ рдпрд╛ рдХреБрдЫ рдФрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
MyComponent().createView(AnkoContext.create(context, myVew)) class MyComponent: AnkoComponent<View> { override fun createView(ui: AnkoContext<View>): View = with(ui) { val myView: View= ui.owner
рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ - setContentView - рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рдгрд╛рдореА рджреГрд╢реНрдп рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдкреНрд░рд╕рдВрдЧ рдПрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рдпрд╛ рдкреНрд░рд╕рдВрдЧрд╡реГрддреНрдд рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ ред рдпрджрд┐ рд╡рд╣ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдПрдХ IllegalStateException рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред
createDelegate
рдпрд╣ рд╡рд┐рдзрд┐ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЧрд┐рд╣рд╛рдм рдкрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИред рдЬрдм рдореИрдВрдиреЗ рдпреВрдЖрдИ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдмреНрд▓реЛрдЯ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рддреЛ рдореИрдВ рдЗрд╕ рд╕реНрд░реЛрдд рдореЗрдВ рдЖ рдЧрдпрд╛:
fun <T: ViewGroup> createDelegate(owner: T): AnkoContext<T> = DelegatingAnkoContext(owner)
рдпрд╣ рдЖрдкрдХреЛ рд╕реНрд╡рд╛рдореА рдХреЛ createView рдШрдЯрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрдбрд╝рд╛ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдХреНрд░реАрди рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ - AppFragmentUiред
verticalLayout { relativeLayout { id = R.id.toolbar
рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЯреВрд▓рдмрд╛рд░ рдФрд░ рд╕рд╛рдордЧреНрд░реА, AppFragmentUiToolbar рдФрд░ AppFragmentUiContent, рдХреНрд░рдорд╢рдГред рддрдм рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рд╡рд░реНрдЧ AppFragmentUi рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛:
class AppFragmentUi: AnkoComponent<AppFragment> { override fun createView(ui: AnkoContext<AppFragment>) = with(ui) { verticalLayout { AppFragmentUiToolbar().createView(AnkoContext.createDelegate(this)) AppFragmentUiContent().createView(AnkoContext.createDelegate(this)) } } } class AppFragmentUiToolbar : AnkoComponent<_LinearLayout> { override fun createView(ui: AnkoContext<_LinearLayout>): View = with(ui.owner) { relativeLayout { id = R.id.toolbar
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ ui рдирд╣реАрдВ, рд▓реЗрдХрд┐рди ui.owner рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ with
рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╣реИрдВ:
- рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- CreateView Method рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП View рдмрдирд╛рддрд╛ рд╣реИред
- рдкрд░рд┐рдгрд╛рдореА рджреГрд╢реНрдп рдХреЛ рд╕реНрд╡рд╛рдореА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдирд┐рдХрдЯ рд╕рдиреНрдирд┐рдХрдЯрди: this.addView(AppFragmentUiToolbar().createView(...))
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, createDelegate рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИред
createReusable
рдпрд╣ рдорд╛рдирдХ AnkoContext.create рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд - рдирд╡реАрдирддрдо рджреГрд╢реНрдп рдХреЛ рдореВрд▓ рджреГрд╢реНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ:
class MyComponent: AnkoComponent<MyObject> { override fun createView(ui: AnkoContext<MyObject>): View = with(ui) { textView("Some text")
рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдпрджрд┐ рд░реВрдЯ рджреГрд╢реНрдп рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рджреВрд╕рд░рд╛ рджреГрд╢реНрдп рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ ред
CreateReusable рдореЗрдердб ReusableAnkoContext рдХреНрд▓рд╛рд╕ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ AnkoContextImpl рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж alreadyHasView()
рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИред
CustomView
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдирдХреЛ рд▓реЗрдЖрдЙрдЯ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╣рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдХрд╕реНрдЯрдо рджреГрд╢реНрдп рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧрд╛
verticalLayout { val view = CustomView(context)
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд░реИрдкрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдРрд╕рд╛ рд╣реА рдХрд░реЗрдЧрд╛ред
рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдШрдЯрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рд╣реИрдВ <T: View>ankoView(factory: (Context) -> T, theme: Int, init: T.() -> Unit)
ViewManager, Context рдпрд╛ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕реЗред
- factory - рдПрдХ рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕ рдЗрдирдкреБрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рджреГрд╢реНрдп рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╡рд╣ рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреГрд╢реНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИред
- рдереАрдо рдПрдХ рд╢реИрд▓реА рд╕рдВрд╕рд╛рдзрди рд╣реИ рдЬрд┐рд╕реЗ рд╡рд░реНрддрдорд╛рди рджреГрд╢реНрдп рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- init рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╡реНрдпреВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
рд╣рдорд╛рд░реЗ CustomView рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝реЗрдВ
inline fun ViewManager.customView(theme: Int = 0, init: (CustomView).() -> Unit): CustomView { return ankoView({ CustomView(it) }, theme, init) }
рдЕрдм рд╣рдорд╛рд░рд╛ CustomView рдмрд╣реБрдд рд╣реА рд╕рд░рд▓рддрд╛ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
customView { id = R.id.customview
рд▓реЗрдЖрдЙрдЯрдкрд░рдореНрд╕ рдХреЛ рд╡реНрдпреВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд▓реИрдкрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
textView("text") { textSize = 12f }.lparams(width = matchParent, height = wrapContent) { centerInParent() }
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА рджреГрд╢реНрдп рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИ - рд╕рднреА рд▓реИрдкрд░рдо рд╡рд┐рдзрд┐рдпрд╛рдВ рдЖрдорддреМрд░ рдкрд░ рд░реИрдкрд░ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, _RelativeLayout RelativeLayout рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рднреА рдХреЗ рд▓рд┐рдПред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдВрдбреНрд░реЙрдЗрдб рд╕рдкреЛрд░реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдХрдИ рдЖрд╡рд░рдг рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреЗрд╡рд▓ рдЧреНрд░реЗрдб рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
// Appcompat-v7 (Anko Layouts) implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version" implementation "org.jetbrains.anko:anko-coroutines:$anko_version" // CardView-v7 implementation "org.jetbrains.anko:anko-cardview-v7:$anko_version" // Design implementation "org.jetbrains.anko:anko-design:$anko_version" implementation "org.jetbrains.anko:anko-design-coroutines:$anko_version" // GridLayout-v7 implementation "org.jetbrains.anko:anko-gridlayout-v7:$anko_version" // Percent implementation "org.jetbrains.anko:anko-percent:$anko_version" // RecyclerView-v7 implementation "org.jetbrains.anko:anko-recyclerview-v7:$anko_version" implementation "org.jetbrains.anko:anko-recyclerview-v7-coroutines:$anko_version" // Support-v4 (Anko Layouts) implementation "org.jetbrains.anko:anko-support-v4:$anko_version" // ConstraintLayout implementation "org.jetbrains.anko:anko-constraint-layout:$anko_version"
рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рднрд┐рдиреНрди рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рднрдВрдбрд╛рд░ рд╕реЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг:
seekBar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) = Unit override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit override fun onStopTrackingTouch(seekBar: SeekBar) = Unit })
рдФрд░ рдЕрдм Anko рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░
seekBar { onSeekBarChangeListener { onProgressChanged { seekBar, progress, fromUser -> // do something } } }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ рд╢реНрд░реЛрддрд╛ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ:
verticalLayout{ val anyCoroutineContext = GlobalScope.coroutineContext onClick(anyCoroutineContext) {
рдЖрдБрдХреЛ рдХреЛрд░рдЯрд╛рдЗрди
рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡-рд╕рдВрд╡реЗрджреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, asReference
рд╡рд┐рдзрд┐ рдХрд╛ asReference
ред рдпрд╣ WeakReference рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ Ref рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ ред
verticalLayout{ val activity = ui.owner val activityReference: Ref<AppActivity> = activity.asReference() onClick(anyCoroutineContext) { ref().doSomething() } }
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдорд╛рдирдХ ViewPager.OnPageChangeListener рдореЗрдВ corutin рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдЗрдП рдЗрд╕реЗ рд╕рд╛рдХрдмрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдВрдд рдХрд░реЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдФрд░ ViewPager.OnPageChangeListener рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВред
class CoroutineOnPageChangeListener( private val coroutineContext: CoroutineContext = Dispatchers.Main ) : ViewPager.OnPageChangeListener { }
рд╣рдо рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ ViewPager.OnPageChangeListener рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
private var onPageScrollStateChanged: ((Int, CoroutineContext) -> Unit)? = null private var onPageScrolled: ((Int, Float, Int, CoroutineContext) -> Unit)? = null private var onPageSelected: ((Int, CoroutineContext) -> Unit)? = null
рд╣рдо рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ (рдмрд╛рдХреА рдХрд╛рдо рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ)
fun onPageScrollStateChanged(action: ((Int, CoroutineContext) -> Unit)?) { onPageScrollStateChanged = action }
рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣рдо рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
override fun onPageScrollStateChanged(state: Int) { GlobalScope.launch(coroutineContext) { onPageScrollStateChanged?.invoke(state, coroutineContext) } }
рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ
fun ViewPager.onPageChangeListenerCoroutines(init: CoroutineOnPageChangerListener.() -> Unit) { val listener = CoroutineOnPageChangerListener() listener.init() addOnPageChangeListener(listener) }
рдФрд░ рдЗрд╕ рдкреВрд░реА рдЪреАрдЬрд╝ рдХреЛ ViewPager рдХреЗ рдиреАрдЪреЗ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ
viewPager { onPageChangeListenerCoroutines { onPageScrolled { position, offset, pixels, coroutineContext ->
рдпрд╣рд╛рдВ рдкреВрд░рд╛ рдХреЛрдб class CoroutineOnPageChangeListener( private val coroutineContext: CoroutineContext = Dispatchers.Main ) : ViewPager.OnPageChangeListener { private var onPageScrollStateChanged: ((Int, CoroutineContext) -> Unit)? = null private var onPageScrolled: ((Int, Float, Int, CoroutineContext) -> Unit)? = null private var onPageSelected: ((Int, CoroutineContext) -> Unit)? = null fun onPageScrollStateChanged(action: ((Int, CoroutineContext) -> Unit)?) { onPageScrollStateChanged = action } fun onPageScrolled(action: ((Int, Float, Int, CoroutineContext) -> Unit)?) { onPageScrolled = action } fun onPageSelected(action: ((Int, CoroutineContext) -> Unit)?) { onPageSelected = action } override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { GlobalScope.launch(coroutineContext) { onPageScrolled?.invoke(position, positionOffset, positionOffsetPixels, coroutineContext) } } override fun onPageSelected(position: Int) { GlobalScope.launch(coroutineContext) { onPageSelected?.invoke(position, coroutineContext) } } override fun onPageScrollStateChanged(state: Int) { GlobalScope.launch(coroutineContext) { onPageScrollStateChanged?.invoke(state, coroutineContext) } } } fun ViewPager.onPageChangeListenerCoroutines(init: CoroutineOnPageChangerListener.() -> Unit) { val listener = CoroutineOnPageChangerListener() listener.init() addOnPageChangeListener(listener) }
рдПрдВрдХреЛ рд▓реЗрдЖрдЙрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рднреА рдХрдИ рдЙрдкрдпреЛрдЧреА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рдЬреИрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдЕрдиреБрд╡рд╛рджред