рдорд▓реНрдЯреА-рдореЙрдбреНрдпреВрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди



рдПрдВрдбреНрд░реЙрдЗрдб рдРрдк рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░ рдЖрдкрдХреЛ рджреЛ рдмрд╛рд░ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреМрди рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдпрд╛ рдЖрдкрдХрд╛ рдЦреБрдж рдХрд╛ рд╕рдорд╛рдзрд╛рди) рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╕реВрдЯ рдХрд░рддреА рд╣реИ рдФрд░ рдРрдк рдХреЗ рдмрдбрд╝реЗ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреИрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕реЛрдЪрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдПрдХ рдХрд╣рд╛рдиреА рдмрддрд╛рддрд╛ рд╣реВрдБред рдЪрд▓реЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд╣рддреЗ рд╣реИрдВ "рд╣рдордиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЙрдбреНрдпреВрд▓рд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдФрд░ рдореБрдЭреЗ рд╣рдорд╛рд░реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕реЗ рдирдлрд░рдд рдХреНрдпреЛрдВ рд╣реБрдИред"

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдХрд▓ рдореЙрдбреНрдпреВрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдереА рдФрд░ рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛, рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдбреИрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдПрдХ рдПрдХрд▓ рдШрдЯрдХ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрд╛ред рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд▓реЙрдЧрд┐рди рд╕реБрд╡рд┐рдзрд╛, рдПрдХ рд╕рд╣рд╛рдпрддрд╛ рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдЖрджрд┐ред

рд╣рдореЗрдВ рдмрд╣реБрдд рд╕реА рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рдЖрдИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЕрдкрдиреЗ рдЧреНрд░реЗрдбреЗрдб рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдкрдбрд╝рд╛, рдбреЛрдореЗрди рдХреЛ рдЙрд╕рдХреЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рд╕рд╛рде рд╣реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдБ рднреА рдереАрдВред

рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд░рд╛рдЙрдЯрд░ рдерд╛ рдЬреЛ рд╣рд░ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рдерд╛ рдФрд░ рдпрд╣ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдерд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рд░ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдЬрд╛рдирддрд╛ рдерд╛ рдХрд┐ рд░рд╛рдЙрдЯрд░ рд╣реИ рдФрд░ рдЕрдиреНрдп рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдиреЗ рд░рд╛рдЙрдЯрд░ рд╕реЗ рдХрд╣рд╛ рдХрд┐ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЛ рдХреНрдпрд╛ рдЦреЛрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдлреНрд░реИрдЧрдореЗрдВрдЯ рджреВрд╕рд░реЗ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЗрди рдЪреАрдЬреЛрдВ рдиреЗ рд╕реНрд╡рддрдВрддреНрд░ рдлреАрдЪрд░ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рджрд┐рдпрд╛ред

рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдпрд╣ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рдмреАрдЪ рдЗрди рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рддреЛрдбрд╝реЗрдВ, рдХреИрд╕реЗ рдЬреНрдЮрд╛рди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ рдХрд┐ рдХреБрдЫ рд░рд╛рдЙрдЯрд░ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдмрдирд╛рдпрд╛ рд╣реИред

рд╣рдо рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ



рдЖрд╡реЗрджрди рд╕реБрдкрд░ рд╕рд░рд▓ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдореЙрдбреНрдпреВрд▓рд░ рд╣реЛрдЧрд╛ред рдПрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЙрдбреНрдпреВрд▓ рдФрд░ рддреАрди рдлрд╝реАрдЪрд░ рдореЙрдбреНрдпреВрд▓ рд╣реЛрдВрдЧреЗ:

  • рдРрдк рдореЙрдбреНрдпреВрд▓ - рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдРрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рд╣рдо рдЕрдкрдиреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рд╣рдо JetPack рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
  • рдкреНрд░рд╢реНрди рдореЙрдбреНрдпреВрд▓ - рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдкреНрд░рд╢реНрди рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдореЙрдбреНрдпреВрд▓ рдРрдк рдореЙрдбреНрдпреВрд▓ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдПрдХ QuestionsFragment рдФрд░ рдПрдХ QuestionsNavigation рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдЧрд╛ред
  • рдкреНрд░рд╢реНрди рдореЙрдбреНрдпреВрд▓ - рдПрдХ рдкреНрд░рд╢реНрди рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреАред рдкрд┐рдЫрд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ QuestionFragment рдФрд░ рдПрдХ QuestionNavigation рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдЧрд╛ред
  • рдкрд░рд┐рдгрд╛рдо рдореЙрдбреНрдпреВрд▓ - рдпрд╣ рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдореЙрдбреНрдпреВрд▓ рд╣реИред рдПрдХ RightAnswerFragment RightAnswerNavigation рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ рдФрд░ рдПрдХ WrongAnswerFragment рдПрдХ WrongAnswerNavigation рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: GitHub ред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдлреАрдЪрд░ рдХреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ComponentsManager рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореИрдВ рдбреИрдЧрд░ рджреНрд╡рд╛рд░рд╛ рдлреАрдЪрд░ рдХрд╛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд╕рд╛рде рд╣реА, ComponentManager рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ рдорд▓реНрдЯреА-рдореЙрдбреНрдпреВрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдбреИрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред

рдХреНрдпрд╛ рдЖрдк рддреИрдпрд╛рд░ рд╣реИрдВ? рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!

рдкреНрд░рд╢реНрди рдореЙрдбреНрдпреВрд▓


рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреЙрдиреНрд╕рдЯреНрд░реИрдЯрд┐рдирд▓рдЖрдЙрдЯ рдФрд░ рдХреЙрдореНрдкреЛрдиреЗрдиреНрдЯрдореЗрдиреЗрдЬрд░ рдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред

 //build.gradle (for the questions module) apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { ... } dependencies { ... implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.1.0-alpha01' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation "com.github.valeryponomarenko.componentsmanager:androidx:2.0.1" ... } 

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 рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рдорд╛рди рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

 //build.gradle (for the question module) apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { ... } dependencies { ... implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.1.0-alpha01' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation "com.github.valeryponomarenko.componentsmanager:androidx:2.0.1" ... } 

рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╡рд┐рдЪрд╛рд░ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддрд░рд╣ рд╣реА рд╣реЛрдЧрд╛ред

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() } } } 

рдкрд░рд┐рдгрд╛рдо рдореЙрдбреНрдпреВрд▓


рдЕрдВрддрд┐рдо рдлреАрдЪрд░ рдореЙрдбреНрдпреВрд▓ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдореЙрдбреНрдпреВрд▓ рд╣реИред рджреЛ рдЯреБрдХрдбрд╝реЗ рд╣реЛрдВрдЧреЗ рдЬреЛ рдПрдХ рд╕рд╣реА рдФрд░ рдЧрд▓рдд рдЙрддреНрддрд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдкрд░рд┐рдгрд╛рдо рджреЗрдВ , рдлрд┐рд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд┐рд▓реНрдб.рдЧреНрд░реЗрдб рдХреЛ рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рдЙрд╕рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдлреАрдЪрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдорд╛рди рдирд┐рд░реНрднрд░рддрд╛ рд╣реЛред

 //build.gradle (for the result module) apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { ... } dependencies { ... implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.1.0-alpha01' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation "com.github.valeryponomarenko.componentsmanager:androidx:2.0.1" ... } 

рдЪрд▓реЛ рд╕рд╣реА рдЬрд╡рд╛рдм рдЯреБрдХрдбрд╝реЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рднреА рдкреНрд░рд╢реНрди рд╕реНрдХреНрд░реАрди рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИред

 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() } } } 

рдРрдк рдореЙрдбреНрдпреВрд▓


рд╣рдордиреЗ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдП рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдРрдк рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдмрд╛рдд, рд╣рдореЗрдВ рдРрдк рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдШрдЯрдХ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд╕рд╛рде рд╕рднреА рдирд┐рд░реНрдорд┐рдд рдореЙрдбреНрдпреВрд▓ рдФрд░ рдПрдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

 //build.gradle (for the app module) apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { ... } dependencies { ... implementation project(':questions') implementation project(':question') implementation project(':result') implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.1.0-alpha01' implementation 'com.github.valeryponomarenko.componentsmanager:androidx:2.0.1' implementation 'android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha11' ... } 

рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЦреБрдж рдХреЛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдиреИрд╡рд┐рдЧреЗрд╢рди рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдПрдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕рдВрд╕рд╛рдзрди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ 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

Source: https://habr.com/ru/post/hi443288/


All Articles