
рдПрдВрдбреНрд░реЙрдЗрдб рдРрдк рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░ рдЖрдкрдХреЛ рджреЛ рдмрд╛рд░ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреМрди рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдпрд╛ рдЖрдкрдХрд╛ рдЦреБрдж рдХрд╛ рд╕рдорд╛рдзрд╛рди) рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╕реВрдЯ рдХрд░рддреА рд╣реИ рдФрд░ рдРрдк рдХреЗ рдмрдбрд╝реЗ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреИрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕реЛрдЪрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдПрдХ рдХрд╣рд╛рдиреА рдмрддрд╛рддрд╛ рд╣реВрдБред рдЪрд▓реЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд╣рддреЗ рд╣реИрдВ "рд╣рдордиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЙрдбреНрдпреВрд▓рд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдФрд░ рдореБрдЭреЗ рд╣рдорд╛рд░реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕реЗ рдирдлрд░рдд рдХреНрдпреЛрдВ рд╣реБрдИред"
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдХрд▓ рдореЙрдбреНрдпреВрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдереА рдФрд░ рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛, рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдбреИрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдПрдХ рдПрдХрд▓ рдШрдЯрдХ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрд╛ред рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд▓реЙрдЧрд┐рди рд╕реБрд╡рд┐рдзрд╛, рдПрдХ рд╕рд╣рд╛рдпрддрд╛ рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдЖрджрд┐ред
рд╣рдореЗрдВ рдмрд╣реБрдд рд╕реА рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рдЖрдИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЕрдкрдиреЗ рдЧреНрд░реЗрдбреЗрдб рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдкрдбрд╝рд╛, рдбреЛрдореЗрди рдХреЛ рдЙрд╕рдХреЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рд╕рд╛рде рд╣реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдБ рднреА рдереАрдВред
рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд░рд╛рдЙрдЯрд░ рдерд╛ рдЬреЛ рд╣рд░ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рдерд╛ рдФрд░ рдпрд╣ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдерд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рд░ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдЬрд╛рдирддрд╛ рдерд╛ рдХрд┐ рд░рд╛рдЙрдЯрд░ рд╣реИ рдФрд░ рдЕрдиреНрдп рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдиреЗ рд░рд╛рдЙрдЯрд░ рд╕реЗ рдХрд╣рд╛ рдХрд┐ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЛ рдХреНрдпрд╛ рдЦреЛрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдлреНрд░реИрдЧрдореЗрдВрдЯ рджреВрд╕рд░реЗ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЗрди рдЪреАрдЬреЛрдВ рдиреЗ рд╕реНрд╡рддрдВрддреНрд░ рдлреАрдЪрд░ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рджрд┐рдпрд╛ред
рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдпрд╣ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рдмреАрдЪ рдЗрди рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рддреЛрдбрд╝реЗрдВ, рдХреИрд╕реЗ рдЬреНрдЮрд╛рди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ рдХрд┐ рдХреБрдЫ рд░рд╛рдЙрдЯрд░ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдмрдирд╛рдпрд╛ рд╣реИред
рд╣рдо рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ
рдЖрд╡реЗрджрди рд╕реБрдкрд░ рд╕рд░рд▓ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдореЙрдбреНрдпреВрд▓рд░ рд╣реЛрдЧрд╛ред рдПрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЙрдбреНрдпреВрд▓ рдФрд░ рддреАрди рдлрд╝реАрдЪрд░ рдореЙрдбреНрдпреВрд▓ рд╣реЛрдВрдЧреЗ:
- рдРрдк рдореЙрдбреНрдпреВрд▓ - рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдРрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рд╣рдо рдЕрдкрдиреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рд╣рдо JetPack рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
- рдкреНрд░рд╢реНрди рдореЙрдбреНрдпреВрд▓ - рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдкреНрд░рд╢реНрди рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдореЙрдбреНрдпреВрд▓ рдРрдк рдореЙрдбреНрдпреВрд▓ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдПрдХ
QuestionsFragment
рдФрд░ рдПрдХ QuestionsNavigation
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдЧрд╛ред - рдкреНрд░рд╢реНрди рдореЙрдбреНрдпреВрд▓ - рдПрдХ рдкреНрд░рд╢реНрди рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреАред рдкрд┐рдЫрд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ
QuestionFragment
рдФрд░ рдПрдХ QuestionNavigation
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдЧрд╛ред - рдкрд░рд┐рдгрд╛рдо рдореЙрдбреНрдпреВрд▓ - рдпрд╣ рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдореЙрдбреНрдпреВрд▓ рд╣реИред рдПрдХ
RightAnswerFragment
RightAnswerNavigation
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ рдФрд░ рдПрдХ WrongAnswerFragment
рдПрдХ WrongAnswerNavigation
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
GitHub ред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдлреАрдЪрд░ рдХреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
ComponentsManager рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореИрдВ
рдбреИрдЧрд░ рджреНрд╡рд╛рд░рд╛ рдлреАрдЪрд░ рдХрд╛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд╕рд╛рде рд╣реА,
ComponentManager рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ рдорд▓реНрдЯреА-рдореЙрдбреНрдпреВрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ
рдбреИрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред
рдХреНрдпрд╛ рдЖрдк рддреИрдпрд╛рд░ рд╣реИрдВ? рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!
рдкреНрд░рд╢реНрди рдореЙрдбреНрдпреВрд▓
рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░
рдХреЙрдиреНрд╕рдЯреНрд░реИрдЯрд┐рдирд▓рдЖрдЙрдЯ рдФрд░
рдХреЙрдореНрдкреЛрдиреЗрдиреНрдЯрдореЗрдиреЗрдЬрд░ рдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
Fragment
рдореЗрдВ
Route
рдпрд╛
Navigator
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕
QuestionsNavigation
рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЙрди рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕реЗ рдмрд╕ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЬрдм рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЖрд╡рд╢реНрдпрдХ рд╕реНрдХреНрд░реАрди рдЦреБрд▓реА рд╣реЛрдЧреАред
interface QuestionsNavigation { fun openQuestion(questionId: Long) }
рдПрдХ рдкреНрд░рд╢реНрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдХреНрд░реАрди рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд┐рд░реНрдл
openQuestion(questionId: Long)
рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╣реИред рд╣рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реАрди рдХреИрд╕реЗ рдЦреЛрд▓реА рдЬрд╛рдПрдЧреА, рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рднреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣
Fragment
рдпрд╛
Activity
рдпрд╛ рдХреБрдЫ рдФрд░ред
рдпрд╣рд╛рдБ
QuestionsFragment
рдФрд░ рдЗрд╕рдХрд╛
рд▓реЗрдЖрдЙрдЯ рд╣реИ ред
class QuestionsFragment : Fragment() { private val navigation: QuestionsNavigation by lazy { XInjectionManager.findComponent<QuestionsNavigation>() } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.fragment_questions, container, false) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) button_first_question.setOnClickListener { navigation.openQuestion(1) } button_second_question.setOnClickListener { navigation.openQuestion(2) } button_third_question.setOnClickListener { navigation.openQuestion(3) } } }
рдкреНрд░рд╢реНрди рдореЙрдбреНрдпреВрд▓
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ
рдкреНрд░рд╢реНрди рдХрд╣реЗрдВред рдореЙрдбреНрдпреВрд▓ рдХреА build.gradle рдореЗрдВ рдкреНрд░рд╢реНрди рдореЙрдбреНрдпреВрд▓ рдХреЗ build.gradle рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рдорд╛рди рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╡рд┐рдЪрд╛рд░ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддрд░рд╣ рд╣реА рд╣реЛрдЧрд╛ред
QuestionFragment
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдЧрд▓рдд рдЙрддреНрддрд░ рд╕реНрдХреНрд░реАрди рдпрд╛ рдПрдХ рд╕рд╣реА рдЙрддреНрддрд░ рд╕реНрдХреНрд░реАрди рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреАред
interface QuestionNavigation { fun openWrongAnswer() fun openRightAnswer() }
рдЖрдЦрд┐рд░реА рдЪреАрдЬ рд╣реИ рдЯреБрдХрдбрд╝рд╛ред рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд╛рдереА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдЬреЛ рдПрдХ
Bundle
рд▓реМрдЯрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдкреНрд░рд╢реНрди рдЖрдИрдбреА рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред рдЯреБрдХрдбрд╝реЗ рдХрд╛
рд▓реЗрдЖрдЙрдЯ ред
class QuestionFragment : Fragment() { companion object { private const val EXTRA_QUESTION_ID = "me.vponomarenko.modular.navigation.question.id" fun createBundle(questionId: Long) = Bundle().apply { putLong(EXTRA_QUESTION_ID, questionId) } } private val navigation: QuestionNavigation by lazy { XInjectionManager.findComponent<QuestionNavigation>() } private val questionId: Long by lazy { arguments?.getLong(EXTRA_QUESTION_ID) ?: throw IllegalStateException("no questionId") } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.fragment_question, container, false) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) text_question.text = getString(R.string.question, questionId) button_right_answer.setOnClickListener { navigation.openRightAnswer() } button_wrong_answer.setOnClickListener { navigation.openWrongAnswer() } } }
рдкрд░рд┐рдгрд╛рдо рдореЙрдбреНрдпреВрд▓
рдЕрдВрддрд┐рдо рдлреАрдЪрд░ рдореЙрдбреНрдпреВрд▓ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдореЙрдбреНрдпреВрд▓ рд╣реИред рджреЛ рдЯреБрдХрдбрд╝реЗ рд╣реЛрдВрдЧреЗ рдЬреЛ рдПрдХ рд╕рд╣реА рдФрд░ рдЧрд▓рдд рдЙрддреНрддрд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ
рдкрд░рд┐рдгрд╛рдо рджреЗрдВ , рдлрд┐рд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд┐рд▓реНрдб.рдЧреНрд░реЗрдб рдХреЛ рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдЙрд╕рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдлреАрдЪрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдорд╛рди рдирд┐рд░реНрднрд░рддрд╛ рд╣реЛред
рдЪрд▓реЛ рд╕рд╣реА рдЬрд╡рд╛рдм рдЯреБрдХрдбрд╝реЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рднреА рдкреНрд░рд╢реНрди рд╕реНрдХреНрд░реАрди рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИред
interface RightAnswerNavigation { fun openAllQuestions() }
RightAnswerFragment
, рдЗрд╕рдХрд╛
рд▓реЗрдЖрдЙрдЯ ред
class RightAnswerFragment : Fragment() { private val navigation: RightAnswerNavigation by lazy { XInjectionManager.findComponent<RightAnswerNavigation>() } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.fragment_right, container, false) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) button_all_questions.setOnClickListener { navigation.openAllQuestions() } } }
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рджреЛ
Fragments
, рддреЛ рдЪрд▓рд┐рдП рдПрдХ рдЧрд▓рдд рдЙрддреНрддрд░ рд╕реНрдХреНрд░реАрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдЧрд▓рдд рдЙрддреНрддрд░ рд╕реНрдХреНрд░реАрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдХреЗрд╡рд▓ рдкреНрд░рд╢реНрди рдХреА рд╕реНрдХреНрд░реАрди рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рд╣реИред
interface WrongAnswerNavigation { fun tryAgain() }
рдФрд░ WrongAnswerFragment, рдЗрд╕рдХрд╛
рд▓реЗрдЖрдЙрдЯ ред
class WrongAnswerFragment : Fragment() { private val navigation: WrongAnswerNavigation by lazy { XInjectionManager.findComponent<WrongAnswerNavigation>() } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.fragment_wrong, container, false) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) button_try_again.setOnClickListener { navigation.tryAgain() } } }
рдРрдк рдореЙрдбреНрдпреВрд▓
рд╣рдордиреЗ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдП рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдРрдк рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдмрд╛рдд, рд╣рдореЗрдВ рдРрдк рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд╕рд╛рде рд╕рднреА рдирд┐рд░реНрдорд┐рдд рдореЙрдбреНрдпреВрд▓ рдФрд░ рдПрдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЦреБрдж рдХреЛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдиреИрд╡рд┐рдЧреЗрд╢рди рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдПрдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕рдВрд╕рд╛рдзрди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ
nav_graph.xml рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВред рддреАрди рдХрдиреЗрдХреНрд╢рди рд╣реЛрдВрдЧреЗ:
QuestionsFragment
рд╕рд╛рде QuestionFragment
WrongAnswerFragment
рд╕рд╛рде WrongAnswerFragment
- The
RightAnwerFragment
рд╕рд╛рде RightAnwerFragment
ред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ RightAnswerFragment
рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмреИрдХ рдмрдЯрди рджрдмрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ RightAnswerFragment
рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдмрд╕ рдЙрд╕ рддреАрд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдЬреЛ questionFragment
рдХреЛ rightAnswerFragment
рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдлрд┐рд░ questionsFragment
рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЙрдк рдХреЗ рдкрд╛рд╕ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдореЗрдВред
рдпрд╣рд╛рдБ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЧреНрд░рд╛рдл рдХрд╛ XML рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИред
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nav_graph" app:startDestination="@id/questionsFragment"> <fragment android:id="@+id/questionsFragment" android:name="me.vponomarenko.modular.navigation.questions.QuestionsFragment" android:label="QuestionsFragment"> <action android:id="@+id/action_questionsFragment_to_questionFragment" app:destination="@id/questionFragment" /> </fragment> <fragment android:id="@+id/questionFragment" android:name="me.vponomarenko.modular.navigation.question.QuestionFragment" android:label="QuestionFragment"> <action android:id="@+id/action_questionFragment_to_wrongAnswerFragment" app:destination="@id/wrongAnswerFragment" /> <action android:id="@+id/action_questionFragment_to_rightAnswerFragment" app:destination="@id/rightAnswerFragment" app:popUpTo="@+id/questionsFragment" /> </fragment> <fragment android:id="@+id/wrongAnswerFragment" android:name="me.vponomarenko.modular.navigation.result.wrong.WrongAnswerFragment" android:label="WrongAnswerFragment" /> <fragment android:id="@+id/rightAnswerFragment" android:name="me.vponomarenko.modular.navigation.result.right.RightAnswerFragment" android:label="RightAnswerFragment" /> </navigation>
рдлрд┐рд░, рдПрдХ
Navigator
рд╡рд░реНрдЧ рдмрдирд╛рдПрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЦрдВрдбреЛрдВ рдХреЗ рдмреАрдЪ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╣ рдлреАрдЪрд░ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╕рднреА рдиреЗрд╡реАрдЧреЗрд╢рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЖрд╡рд╢реНрдпрдХ рд╕реНрдХреНрд░реАрди рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдХреЙрд▓ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдХреНрд╖рд╛ рдХреЗ рдкрд╛рд╕
navController
рдХреЛ рдмрд╛рдВрдзрдиреЗ рдФрд░ рдЗрд╕реЗ рдЕрдирдмрд╛рдЗрдВрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВред
class Navigator : QuestionsNavigation, QuestionNavigation, RightAnswerNavigation, WrongAnswerNavigation { private var navController: NavController? = null override fun openQuestion(questionId: Long) { navController?.navigate( R.id.action_questionsFragment_to_questionFragment, QuestionFragment.createBundle(questionId) ) } override fun openWrongAnswer() { navController?.navigate(R.id.action_questionFragment_to_wrongAnswerFragment) } override fun openRightAnswer() { navController?.navigate(R.id.action_questionFragment_to_rightAnswerFragment) } override fun openAllQuestions() { navController?.popBackStack() } override fun tryAgain() { navController?.popBackStack() } fun bind(navController: NavController) { this.navController = navController } fun unbind() { navController = null } }
8
рд╡реАрдВ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдореИрдВ рдкреНрд░рд╢реНрди рдЖрдИрдбреА рдХреЛ рдкреНрд░рд╢реНрдирдлрд▓ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдПрдХ
NavApplication
class рдмрдирд╛рдПрдВред рджрд░рдЕрд╕рд▓, рдореБрдЭреЗ
Navigator
рдХреЛ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдерд╛, рдЕрдиреНрдпрдерд╛, рд╕реБрд╡рд┐рдзрд╛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛ред рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВред
class NavApplication : Application() { override fun onCreate() { super.onCreate() XInjectionManager.bindComponentToCustomLifecycle(object : IHasComponent<Navigator> { override fun getComponent(): Navigator = Navigator() }) } }
4
рд╡реАрдВ -6
рд╡реАрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, XInjectionManager.findComponent () рдХреЙрд▓ рдХрд░рдХреЗ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред
рдЕрдВрддрд┐рдо рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо,
MainActivity
рд╡рд░реНрдЧ рдФрд░ рдЙрд╕рдХреЗ
рд▓реЗрдЖрдЙрдЯ рдХреЛ рди рдмрджрд▓реЗрдВред
class MainActivity : AppCompatActivity() { private val navigator: Navigator by lazy { XInjectionManager.findComponent<Navigator>() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } override fun onResume() { super.onResume() navigator.bind(findNavController(R.id.nav_host_fragment)) } override fun onPause() { super.onPause() navigator.unbind() } override fun onSupportNavigateUp(): Boolean = findNavController(R.id.nav_host_fragment).navigateUp() }
рдпрд╣ рд╕рдм рд╣реИ, рдЕрдм рдЖрдк рдРрдк рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╕рд╛рд░рд╛рдВрд╢
рдЕрдЪреНрдЫрд╛ рдХрд╛рдо! рд╣рдордиреЗ рдПрдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдпрд╛ рд╣реИ:
- рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝реАрдЪрд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрд╢рди рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ,
- рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ,
- рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
Krosspost