Created
June 4, 2022 18:21
-
-
Save Debdutta-Panda/6546f27ef6f40824d03f19ac69b79d31 to your computer and use it in GitHub Desktop.
Drawer Navigation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 | |
| ) | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment