Anko рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреЛрдЯрд▓рд┐рди рдкрд░ рдиреАрдЪреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг

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


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдиреЗрдЯ рдХреА рдУрд░ рд░реБрдЦ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдВрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓реЗ рд╕рднреА рд▓реЗрдЦреЛрдВ рдиреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ рдФрд░ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдирд╣реАрдВ (рдЬрд┐рдирдХреЗ рд▓реЗрдЦреЛрдВ рдХрд╛ рдореИрдВрдиреЗ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛) рдпрд╣ Anko рдкрд░ рдХрд┐рдпрд╛ред рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рд╕рдореБрджрд╛рдп рдХреЛ рдиреАрдЪреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реВрдВред


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


implementation "org.jetbrains.anko:anko:$anko_version" implementation "org.jetbrains.anko:anko-constraint-layout:$anko_version" implementation "com.android.support.constraint:constraint-layout:2.0.0-alpha3" implementation 'android.arch.navigation:navigation-fragment:1.0.0-beta02' implementation 'android.arch.navigation:navigation-fragment-ktx:1.0.0-beta02' implementation 'android.arch.navigation:navigation-ui-ktx:1.0.0-beta02' implementation 'com.google.android.material:material:1.0.0' 

рдЕрдЧрд▓рд╛ рдХрджрдо рднрд╡рд┐рд╖реНрдп рдХреЗ рдЖрд╡реЗрджрди рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдирд╛ рд╣реИред рдореБрдЦреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, xml-file рдХреЗ рдмрдЬрд╛рдп, AnAComComententive рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА MainActivityUI рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдБ:


 class MainActivityUI: AnkoComponent<MainActivity> { override fun createView(ui: AnkoContext<MainActivity>): View = with(ui) { constraintLayout { } } } 

MainActivity рдХреНрд▓рд╛рд╕ рдореЗрдВ, SetContentView (R.layout.activity_main) рдХреЛ MainActivityUI () рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред SetContentView (рдпрд╣)ред


рдлрд┐рд░ рд╣рдо рдкреИрдХреЗрдЬ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдЯреБрдХрдбрд╝реЗ рдФрд░ рдкреИрдХреЗрдЬ рдпреВрдЖрдИ рд╕рдВрдмрдВрдзрд┐рдд рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕реНрдХреНрд░реАрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХрдХреНрд╖рд╛рдПрдВ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЭреВрда рд╣реЛрдВрдЧреЗред рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реИ:


 fragments ui HomeUI UsersUI DetailsUI MoreUI HomeFragment UsersFragment DetailsFragment MoreFragment 

рдЕрдм рд╣рдо рд╕реАрдзреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдФрд░ рдмреЙрдЯрдо рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред
рдирдП рдиреЗрд╡рд┐рдЧреЗрд╢рди рдШрдЯрдХреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдХрд╛рдо рдХрд╛ рд╡рд┐рд╡рд░рдг рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкреНрд░рд▓реЗрдЦрди рдкреГрд╖реНрда рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдХреНрд░реАрди рдХреЗ рдмреАрдЪ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд╛рдЗрд▓ (рдЧреНрд░рд╛рдлрд╝) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Res рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдФрд░ рдлрд╝реЛрд▓реНрдбрд░, рдЬреИрд╕реЗ рдХрд┐ рдиреЗрд╡рд┐рдЧреЗрд╢рди, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди_graph.xml рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:


 <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/navigation_graph" app:startDestination="@id/homeFragment"> <fragment android:id="@+id/homeFragment" android:name="com.arsinde.ankobottomnavbar.fragments.HomeFragment" android:label="HomeFragment"> <action android:id="@+id/action_homeFragment_to_detailsFragment" app:destination="@id/detailsFragment"/> </fragment> <fragment android:id="@+id/detailsFragment" android:name="com.arsinde.ankobottomnavbar.fragments.DetailsFragment" android:label="DetailsFragment"> <action android:id="@+id/action_detailsFragment_to_usersFragment" app:destination="@id/usersFragment"/> </fragment> <fragment android:id="@+id/usersFragment" android:name="com.arsinde.ankobottomnavbar.fragments.UsersFragment" android:label="UsersFragment"> <action android:id="@+id/action_usersFragment_to_moreFragment" app:destination="@id/moreFragment"/> </fragment> <fragment android:id="@+id/moreFragment" android:name="com.arsinde.ankobottomnavbar.fragments.MoreFragment" android:label="MoreFragment"/> </navigation> 

рдмрд╛рд░ рдХреЛ рд╕реНрд╡рдпрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдФрд░ рд╕рдВрд╕рд╛рдзрди рдлрд╝реЛрд▓реНрдбрд░, рдЕрд░реНрдерд╛рддреН рдореЗрдиреВ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдореЗрдВ рдмрд╛рд░ рдХреЗ рджреГрд╢реНрдп рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдлрд╝рд╛рдЗрд▓ рд╣реИред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@id/homeFragment" android:icon="@drawable/ic_home" android:title="@string/menu_title_home"/> <item android:id="@id/usersFragment" android:icon="@drawable/ic_users" android:title="@string/menu_title_users"/> <item android:id="@id/detailsFragment" android:icon="@drawable/ic_info" android:title="@string/menu_title_details"/> <item android:id="@id/moreFragment" android:icon="@drawable/ic_more" android:title="@string/menu_title_more"/> </menu> 

рдпрд╣ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


MainActivityUI рдореЗрдВ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред


 constraintLayout { val fragmentContainer = frameLayout { id = R.id.fragment_container }.lparams { width = matchParent height = matchConstraint } val bottomNavigation = bottomNavigation { id = R.id.bottom_nav_view inflateMenu(R.menu.bottom_navigation_menu) } applyConstraintSet { fragmentContainer { connect( START to START of PARENT_ID, END to END of PARENT_ID, TOP to TOP of PARENT_ID, BOTTOM to TOP of R.id.bottom_nav_view ) } bottomNavigation { connect( START to START of PARENT_ID, END to END of PARENT_ID, TOP to BOTTOM of R.id.fragment_container, BOTTOM to BOTTOM of PARENT_ID ) } } } 

рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирд┐рдЪрд▓рд╛ рджрд╛рдпрд┐рддреНрд╡ рдПрдХ рд╡рд┐рд▓реЛрдкрди рдХрд╛рд░реНрдп рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдирд┐рдореНрди рд░реВрдк рд╣реИ:


 inline fun ViewManager.bottomNavigation(init: BottomNavigationView.() -> Unit = {}) = ankoView({ BottomNavigationView(it) }, theme = 0, init = init) 

рдЕрдм MainActivity рдореЗрдВ рдЖрдкрдХреЛ NavHostFragment рдСрдмреНрдЬреЗрдХреНрдЯ (рдбреЙрдХ рджреЗрдЦреЗрдВ) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 private val host by lazy { NavHostFragment.create(R.navigation.navigation_graph) } 

рдФрд░ рдСрдирдХреНрд░реАрдЯ () рд╡рд┐рдзрд┐ рдореЗрдВ, рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:


 supportFragmentManager.beginTransaction() .replace(R.id.fragment_container, host) .setPrimaryNavigationFragment(host) .commit() 

рдкрд░рд┐рд╖реНрдХрд░рдг рд╕реНрдкрд░реНрд╢ - рдСрдирд╕реНрдЯрд╛рд░реНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ () MainActivity рдирд╡рдХрдВрдЯреНрд░реЛрд▓рд░ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЪреБрдирдХрд░ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


 override fun onStart() { super.onStart() val navController = host.findNavController() findViewById<BottomNavigationView>(R.id.bottom_nav_view)?.setupWithNavController(navController) navController.addOnDestinationChangedListener{_, destination, _ -> val dest: String = try { resources.getResourceName(destination.id) } catch (e: Resources.NotFoundException) { Integer.toString(destination.id) } Log.d("NavigationActivity", "Navigated to $dest") } } 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ рдЖрд╡рд╛рдЬ рдХрд░реЗрдВ ...


рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

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


All Articles