How to set the app theme for light and dark mode in Jetpack Compose Android
In this article, we are going to learn about to how to set the app theme for light and dark mode with help of Jetpack compose. We already covered the Jetpack Compose introduction in my first article, If you did not know about the basic introduction of Jetpack Compose and setup then I would be recommended to check this article. App theme is very useful for the user if they want to switch to any theme based on his choice either light or dark mode. So we need to take care few things to support both the mode carefully like the background of the app and the colour of the text to easy readout for the user in both modes easily.
Let’s implement the app theme with the help of code. First of all, we need to create the colour file in kotlin.
import androidx.compose.ui.graphics.Color val purple200 = Color(0xFF651FFF) val purple500 = Color(0xFF6200EA) val background = Color(0xFF2B292B) val background800 = Color(0xFF424242) val background900 = Color(0xFF212121) val white87 = Color(0Xddffffff) val shimmerHighLight = Color(0xA3C2C2C2)
Now we have a set of colours, we can use these colours in our app. Now we have decided to set of TextStyle like text colour and font and size. Let’s create a Type. kt file for this to support the Material design.
import androidx.compose.material.Typography import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.sp // set of dark material typography styles to start with. val DarkTypography = Typography( h1 = TextStyle( fontFamily = FontFamily.Default, fontWeight = FontWeight.Bold, color = Color.White, fontSize = 28.sp ), h2 = TextStyle( fontFamily = FontFamily.Default, fontWeight = FontWeight.Bold, color = Color.White, fontSize = 21.sp ), body1 = TextStyle( fontFamily = FontFamily.Default, fontWeight = FontWeight.Normal, color = Color.White, fontSize = 14.sp ), body2 = TextStyle( fontFamily = FontFamily.Default, fontWeight = FontWeight.Normal, color = white87, fontSize = 14.sp ) ) // set of light material typography styles to start with. val LightTypography = Typography( h1 = TextStyle( fontFamily = FontFamily.Default, fontWeight = FontWeight.Bold, color = background900, fontSize = 28.sp ), h2 = TextStyle( fontFamily = FontFamily.Default, fontWeight = FontWeight.Bold, color = background900, fontSize = 21.sp ), body1 = TextStyle( fontFamily = FontFamily.Default, fontWeight = FontWeight.Normal, color = background800, fontSize = 14.sp ), body2 = TextStyle( fontFamily = FontFamily.Default, fontWeight = FontWeight.Normal, color = background800, fontSize = 14.sp ) )
Now we have darkTypography and LightTypography to support them both dark and light mode and choose the colours and font style and size.
To support the best Palette, we need two palettes for dark and light modes like surface, background, primary colour and secondary code etc.
private val DarkColorPalette = darkColors( background = background, onBackground = background800, primary = purple200, primaryVariant = purple500, secondary = purple500, onPrimary = Color.White, onSecondary = Color.White ) private val LightColorPalette = lightColors( background = Color.White, onBackground = Color.White, surface = Color.White, primary = purple200, primaryVariant = purple500, secondary = purple500, onPrimary = Color.White, onSecondary = Color.White )
Now let’s create a theme.kt file to use the palette and typography and Material design based on system design supported. Here we need to annotate @Composable for the app theme.
@Composable fun AppJetpackComposeTheme( darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit ) { val colors = if (darkTheme) { DarkColorPalette } else { LightColorPalette } val typography = if (darkTheme) { DarkTypography } else { LightTypography } MaterialTheme( colors = colors, typography = typography, shapes = shapes, content = content ) }
Now our theme is ready to use. Let’s see I have MainActivity where I need to use this theme.
import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.sunil.myapplication.ui.theme.AppJetpackComposeTheme class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AppJetpackComposeTheme { Greeting("Android") } } } } @Composable fun Greeting(name: String) { Column( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Text( text = "Hello $name!", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.body1, textAlign = TextAlign.Center ) } } @Preview(showBackground = true) @Composable fun DefaultPreview() { AppJetpackComposeTheme { Greeting("Android") } }
That is it. Now theme will work based on system mode or you can switch the theme manually if you need it. Now in our next article we will try to learn the layout of Jetpack Compose. Happy Coding.
I am a very enthusiastic Android developer to build solid Android apps. I have a keen interest in developing for Android and have published apps to the Google Play Store. I always open to learning new technologies. For any help drop us a line anytime at contact@mobologicplus.com