Skip to content

Instantly share code, notes, and snippets.

@Debdutta-Panda
Created June 4, 2022 18:21
Show Gist options
  • Select an option

  • Save Debdutta-Panda/6546f27ef6f40824d03f19ac69b79d31 to your computer and use it in GitHub Desktop.

Select an option

Save Debdutta-Panda/6546f27ef6f40824d03f19ac69b79d31 to your computer and use it in GitHub Desktop.
Drawer Navigation
package com.debduttapanda.powernavigation
import android.annotation.SuppressLint
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.annotation.DrawableRes
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Menu
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.debduttapanda.powernavigation.ui.theme.PowerNavigationTheme
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
class MainActivity : ComponentActivity() {
@OptIn(ExperimentalAnimationApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
PowerNavigationTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colors.background
) {
DrawerMainScreen()
}
}
}
}
}
@SuppressLint("UnusedMaterialScaffoldPaddingParameter")
@Composable
fun DrawerMainScreen() {
val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
val scope = rememberCoroutineScope()
val navController = rememberNavController()
Scaffold(
scaffoldState = scaffoldState,
topBar = { TopBar(scope = scope, scaffoldState = scaffoldState) },
drawerBackgroundColor = colorResource(id = R.color.primary),
drawerContent = {
Drawer(scope = scope, scaffoldState = scaffoldState, navController = navController)
},
) {
Navigation(navController = navController)
}
}
@Preview(showBackground = true)
@Composable
fun MainScreenPreview() {
DrawerMainScreen()
}
@Composable
fun TopBar(scope: CoroutineScope, scaffoldState: ScaffoldState) {
TopAppBar(
title = { Text(text = stringResource(R.string.app_name), fontSize = 18.sp) },
navigationIcon = {
IconButton(onClick = {
scope.launch {
scaffoldState.drawerState.open()
}
}) {
Icon(Icons.Filled.Menu, "")
}
},
backgroundColor = colorResource(id = R.color.primary),
contentColor = Color.White
)
}
@Preview(showBackground = false)
@Composable
fun TopBarPreview() {
val scope = rememberCoroutineScope()
val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
TopBar(scope = scope, scaffoldState = scaffoldState)
}
@Composable
fun Drawer(scope: CoroutineScope, scaffoldState: ScaffoldState, navController: NavController) {
val items = listOf(
NavDrawerItem.Home,
NavDrawerItem.Profile,
NavDrawerItem.FriendList,
NavDrawerItem.Settings
)
Column {
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route
items.forEach { item ->
DrawerItem(item = item, selected = currentRoute == item.route, onItemClick = {
navController.navigate(item.route) {
navController.graph.startDestinationRoute?.let { route ->
popUpTo(route) {
saveState = true
}
}
launchSingleTop = true
restoreState = true
}
// Close drawer
scope.launch {
scaffoldState.drawerState.close()
}
})
}
Spacer(modifier = Modifier.weight(1f))
}
}
@Preview(showBackground = false)
@Composable
fun DrawerPreview() {
val scope = rememberCoroutineScope()
val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
val navController = rememberNavController()
Drawer(scope = scope, scaffoldState = scaffoldState, navController = navController)
}
@Composable
fun DrawerItem(item: NavDrawerItem, selected: Boolean, onItemClick: (NavDrawerItem) -> Unit) {
val background = if (selected) R.color.colorPrimaryDark else android.R.color.transparent
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.fillMaxWidth()
.clickable(onClick = { onItemClick(item) })
.height(45.dp)
.background(colorResource(id = background))
.padding(start = 10.dp)
) {
Image(
painter = painterResource(id = item.icon),
contentDescription = item.title,
colorFilter = ColorFilter.tint(Color.White),
contentScale = ContentScale.Fit,
modifier = Modifier
.height(35.dp)
.width(35.dp)
)
Spacer(modifier = Modifier.width(7.dp))
Text(
text = item.title,
fontSize = 18.sp,
color = Color.White
)
}
}
@Preview(showBackground = false)
@Composable
fun DrawerItemPreview() {
DrawerItem(item = NavDrawerItem.Home, selected = false, onItemClick = {})
}
@Composable
fun Navigation(navController: NavHostController) {
NavHost(navController, startDestination = NavDrawerItem.Home.route) {
composable(NavDrawerItem.Home.route) {
CommonPage("Home",R.drawable.ic_baseline_home_24)
}
composable(NavDrawerItem.Profile.route) {
CommonPage("Profile",R.drawable.ic_baseline_person_24)
}
composable(NavDrawerItem.FriendList.route) {
CommonPage("Friends",R.drawable.ic_baseline_group_24)
}
composable(NavDrawerItem.Settings.route) {
CommonPage("Settings",R.drawable.ic_baseline_settings_24)
}
}
}
@Composable
fun CommonPage(text: String, @DrawableRes icon: Int) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
){
Column(
horizontalAlignment = Alignment.CenterHorizontally
) {
Icon(
painter = painterResource(id = icon),
contentDescription = text,
modifier = Modifier.size(200.dp),
tint = Color(0xfff44336)
)
Text(
text,
color = Color(0xfff44336),
fontSize = 24.sp,
fontWeight = FontWeight.Bold
)
}
}
}
package com.debduttapanda.powernavigation
sealed class NavDrawerItem(var route: String, var icon: Int, var title: String) {
object Home : NavDrawerItem("home", R.drawable.ic_baseline_home_24, "Home")
object Profile : NavDrawerItem("profile", R.drawable.ic_baseline_person_24, "Profile")
object FriendList : NavDrawerItem("friendlist", R.drawable.ic_baseline_group_24, "FriendList")
object Settings : NavDrawerItem("settings", R.drawable.ic_baseline_settings_24, "Settings")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment