Skip to content

Instantly share code, notes, and snippets.

@Miha-x64
Last active August 25, 2017 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Miha-x64/1b4afaebe7dd1f0718225a2d6199c223 to your computer and use it in GitHub Desktop.
Save Miha-x64/1b4afaebe7dd1f0718225a2d6199c223 to your computer and use it in GitHub Desktop.
class MainActivity : AppCompatActivity(),
NavigationView.OnNavigationItemSelectedListener, FragmentManager.OnBackStackChangedListener {
private lateinit var drawer: DrawerLayout
private lateinit var toggle: ActionBarDrawerToggle
private lateinit var navigation: NavigationView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// init UI
val toolbar = // ...
setSupportActionBar(toolbar)
drawer = // ...
toggle = ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
toggle.setToolbarNavigationClickListener { super.onBackPressed() }
drawer.addDrawerListener(toggle)
toggle.syncState()
if (savedInstanceState == null) {
openFragmentRoot(State.currentScreen)
} else {
onBackStackChanged() // sync state
}
}
override fun onResume() {
super.onResume()
supportFragmentManager.addOnBackStackChangedListener(this)
}
override fun onPause() {
supportFragmentManager.removeOnBackStackChangedListener(this)
super.onPause()
}
override fun onBackPressed() =
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START)
} else {
super.onBackPressed()
}
override fun onBackStackChanged() {
val burgerAccessible = supportFragmentManager.backStackEntryCount == 0
if (toggle.isDrawerIndicatorEnabled != burgerAccessible) {
toggle.isDrawerIndicatorEnabled = burgerAccessible
if (!burgerAccessible) {
supportActionBar!!.let {
it.setDisplayHomeAsUpEnabled(true)
it.setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_material)
}
}
}
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
drawer.closeDrawer(GravityCompat.START)
openFragmentRoot(item.itemId)
return true
}
internal fun openFragmentRoot(@NavItem navItemId: Int) {
supportFragmentManager.let {
while (it.backStackEntryCount > 0) it.popBackStackImmediate()
it
.beginTransaction()
.replace(R.id.content, NAV_FRAGMENTS[navItemId]!!())
.commitNow()
State.currentScreen = navItemId
navigation.menu.findItem(navItemId).isChecked = true // needed when was no explicit click (eg. restoring from prefs)
onBackStackChanged()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment