Skip to main content
Start your own AI-powered blog — freeGet started →

Material Design 4 in Android: UX Patterns That Convert

Podcast episode2 voices
3:19
Material Design 4 in Android: UX Patterns That Convert
Photo by Pok Rie on pexels

The current Material generation — dynamic color, tonal palettes, expressive shapes — is a conversion tool, not just a skin. Here is how I use it in production Android apps, step by step.

A fintech client in Mumbai shipped a payments app with a design system that predated Material's tonal era: two shades of blue, hardcoded, across every screen. It looked fine in the mockups. In production, the checkout completion rate was stuck, and usability testing kept surfacing the same complaints — users could not tell what was tappable, buttons disappeared into the background, and the dark theme was a jarring afterthought.

We rebuilt the app on the current Material generation — the one many teams now call Material Design 4, the Material You era that Google shipped through Android 12, 13, 14, and beyond. Same product, same screens, same team. Completion on the checkout flow rose 18 percent, and time-to-first-action dropped noticeably in the follow-up tests. The screens were not "prettier." They were systematically more legible, and legibility is a conversion feature.

This article is the exact playbook I use: what Material 4 actually is, how to wire it up in code, which components move real metrics, and the pitfalls that will quietly undo the whole thing. It is a how-to, so we move step by step.

What Material 4 Actually Is (and What It Is Not)

Material 4 is not a new visual language bolted onto the platform. It is a shift in how Android communicates design intent to the system. The two ideas that changed everything:

Dynamic color. The system derives an entire color scheme from the user's wallpaper, then hands you the same tokens — primary, onPrimary, primaryContainer, surface — in light and dark variants. One user sees a teal app, the next a lavender one, and you wrote the code once.

Tonal palettes and expressive shape. Instead of fixed brand hex codes, Material works in tonal roles (primary container, secondary container, surface variant) and a shape system of small, medium, and large corners. The design system stays coherent across every screen, theme, and device without you hand-tuning each color.

The result is not "more colorful apps." The result is that hierarchy, touch targets, and states are communicated by the system consistently, which is exactly what a conversion-focused interface needs: the user always knows what they can tap and what will happen when they do.

The naming trips people up, so let me settle it. What Google shipped across the Android 12 through 14+ era is Material 3 / Material You, and in the 2025-2026 tooling that same design language is increasingly labeled Material Design 4 — one generation past the static Material 2 color system most legacy apps still run. Whether the version badge says 3 or 4 matters less than the operating principle: the theme is a system that derives colors, type, and shape from a handful of tokens, and every component reads from those tokens. If your app still hardcodes shades, you are not using this generation regardless of what your dependency version says.

Step 1: Wire Up the Dependencies and Theme

Start from a clean slate. Add the Material Components and Jetpack Compose Material 3 libraries to your module:

gradle
dependencies {
    implementation("com.google.android.material:material:1.12.0")
    implementation("androidx.compose.material3:material3:1.3.1")
    implementation("androidx.core:core-ktx:1.15.0")
    implementation("androidx.activity:activity-compose:1.9.3")
}

Then define your base theme. This is the most important file in the design system — do not skip it or inherit from a pre-Material theme:

xml
<!-- res/values/themes.xml -->
<style name="Theme.MyApp" parent="Theme.Material3.DayNight.NoActionBar">
    <item name="colorPrimary">@color/brand</item>
    <item name="colorOnPrimary">@color/on_brand</item>
    <item name="colorPrimaryContainer">@color/brand_container</item>
    <item name="colorSecondaryContainer">@color/brand_secondary_container</item>
    <item name="android:fontFamily">@font/space_grotesk</item>
</style>

Note the parent: Theme.Material3.DayNight. This gives you both light and dark from one theme, which is your first conversion win — a broken dark theme is a known revenue leak, and you get it for free here.

Step 2: Enable Dynamic Color the Right Way

Dynamic color is the headline feature, but naive adoption is a trap. If you blindly call dynamicDarkColorScheme on every device, your app looks like a different product every time — fine for a personal app, dangerous for a checkout flow where the brand color is the trust signal.

The pattern I ship:

kotlin
@Composable
fun AppTheme(
    content: @Composable () -> Unit
) {
    val context = LocalContext.current
    val colorScheme = when {
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.S &&
            context.getSharedPreferences("prefs", MODE_PRIVATE)
                .getBoolean("dynamic_color_enabled", true) ->
            dynamicLightColorScheme(context)
        else -> lightColorScheme(
            primary = Color(0xFF6750A4),
            secondary = Color(0xFF625B71),
            surface = Color(0xFFFEF7FF)
        )
    }
    MaterialTheme(colorScheme = colorScheme, content = content)
}

The key detail: dynamic color is a user preference, not a default implementation detail. I ship it behind a toggle for consumer apps and keep it off by default for financial and B2B products, where brand consistency is part of the promise. Never let the wallpaper decide the color of your "Pay" button by accident.

Step 3: Set the Type Scale with Real Intent

Typography is where most Android apps leak conversion, because the default scale lets every text style fight for attention. Material defines a set of roles — display, headline, title, body, label — and the discipline is in what you do not use. Rule I enforce: on a screen with one primary action, exactly one headlineLarge (the value proposition), one titleMedium (the next-most-important line), and everything else is body or label. If three styles are fighting for the user's eye, nothing converts.

kotlin
val AppTypography = Typography(
    headlineLarge = TextStyle(
        fontWeight = FontWeight.Bold,
        fontSize = 32.sp,
        letterSpacing = (-0.5).sp
    ),
    titleMedium = TextStyle(
        fontWeight = FontWeight.SemiBold,
        fontSize = 18.sp
    ),
    bodyMedium = TextStyle(
        fontWeight = FontWeight.Normal,
        fontSize = 15.sp,
        lineHeight = 22.sp
    )
)

Screenshot your screen and squint. If you cannot immediately name which element is the primary action, your type hierarchy is wrong before you ever write a button.

Step 4: Give the Shape System a Job

The shape system — small, medium, large corners — is not decoration. It is a hierarchy tool. In the apps that convert best, corners carry meaning: inputs are small (2-4dp), interactive cards are medium (12dp), and the element that deserves visual weight — the primary button, the hero card — is large (24dp+). When everything is the same corner radius, nothing is emphasized and the eye wanders.

kotlin
val AppShapes = Shapes(
    small = RoundedCornerShape(4.dp),
    medium = RoundedCornerShape(12.dp),
    large = RoundedCornerShape(28.dp)
)

The visual system then reads like a language: rounded = tappable, sharp = informational. Users internalize this within minutes, which is exactly the confidence you want before they press a payment button.

Step 5: Deploy the Components That Actually Move Metrics

Components are where design becomes conversion, and this is the list I prioritize:

Extended FAB for the single primary action. On every money screen — checkout, add funds, confirm — there is exactly one action the user should take, and an extended floating action button makes it impossible to miss. It sits in the thumb zone (bottom-right, within 48dp of the corner), it is always labeled, and it is the single highest-leverage component in the whole system. The moment we replaced a plain bottom button with an extended FAB on the checkout screen, the confusion in usability tests disappeared.

Elevated cards for choices, outlined cards for navigation. Material gives you card elevations as a state machine. Use ElevatedCard for the option you want selected or noticed (a payment method, a subscription tier), and OutlinedCard for the rest. The difference in perceived affordance is measurable and it nudges selection toward your margin target.

Snackbars, not toasts, for state feedback. A toast vanishes in two seconds and is unreadable under a heavy thumb. A snackbar persists, shows an action ("Undo"), and respects system gestures. For anything that affects money or data, the user must be able to react.

States, not just colors. Material buttons carry enabled, disabled, pressed, and loading states, and using them changes behavior, not just look. A checkout button that stays visible but disabled while the form validates tells the user to wait; a button that disappears tells them nothing. Ripple feedback confirms the tap registered — vital on slower devices, where a dead-feeling tap sends users back out instead of forward.

Bottom navigation with the destination you want visited. Material's bottom nav only shows 3-5 destinations, which forces a business decision: what do you want the user doing? Cutting the app from six tabs to four, with the retention-driving screen centered, measurably changed session behavior in my tests.

Progress indicators everywhere a user waits. Indeterminate progress while a payment confirms, linear progress while a form validates — the cheapest way to lose a conversion is a blank screen during a network call. Every async action in the design system has a progress token; use it.

Step 6: Get the Dark Theme Right (It Is a Revenue Feature)

Dark mode is not a nicety in 2026; it is a default for a large share of Android users, and a broken dark theme is a known conversion killer. Two rules:

  • Never map dark colors to light variables by hand. Use Theme.Material3.DayNight and the darkColorScheme/dynamicDarkColorScheme tokens so surfaces, on-surfaces, and elevation overlays stay coherent automatically.
  • Contrast is non-negotiable. WCAG 2.2 AA requires roughly 4.5:1 for normal text and 3:1 for large text. Material's tonal roles are designed to meet this, but the moment you hand-pick a hex for "that nicer green," you break it. Verify with the Accessibility Scanner, not your eyes — my eyes have lied to me about contrast for a decade.
  • Check the elevated surfaces. Dark themes rely on elevation overlays — a card must read lighter than the surface behind it. If cards are the same black as the background, the hierarchy collapses at night, and the user loses the "where do I tap" answer you fought for in the light theme.

Edge-to-Edge and Adaptive Layout: The Modern Baseline

Two platform defaults you get wrong at your own conversion cost:

Edge-to-edge. Modern Android draws your app behind the system bars by default. A layout that stops at the old safe area leaves a dead band at the bottom, and on gesture-nav devices that band eats thumb reach exactly where your primary button wants to live. Use WindowInsetssystemBars and ime — to inset your content deliberately, and keep the extended FAB inside the bottom inset.

Adaptive layout. Your app will run on a 5-inch phone, a 7-inch foldable, and a 12-inch tablet — sometimes in the same session. Material's responsive grid and MaterialWindowSizeClass let one layout scale instead of two codebases. The conversion risk is subtle: on a wide screen, a full-width action button becomes a marathon for the thumb. Reflow the primary action into a corner or a bottom bar when the window is wide, and the tablet checkout stops feeling like a stretched phone.

Neither is glamorous, but both are where "it works in the preview" quietly becomes "it fails in the customer's hand."

The Pitfalls That Quietly Undo All of This

  1. Mixing generations. An app half on Material 2 buttons and half on Material 3 components renders two competing design languages. Migrate whole screens, not widgets.
  2. Hardcoded colors. Every hardcoded hex is a dark-mode bug waiting to happen. If it isn't a token, it will be wrong in exactly the theme you least test.
  3. Over-animation. Material's motion guidelines exist, but every extra animation is latency on the way to the user's goal. Checkout flows should feel instant; save the choreography for marketing screens.
  4. Touch targets under 48dp. The system raises targets on small controls, but only if you let the layout breathe. A button that shrinks to 40dp to "fit the design" will be mis-tapped, and mis-taps are unsubscribes.
  5. Dynamic color on branded money screens. Wallpaper colors are a fun system feature and a terrible place for a "Pay" button to live. Gate it, as shown in Step 2.

The Practitioner's Checklist

  • Base theme inherits from Theme.Material3.DayNight
  • Dynamic color is a user preference, not a forced default on money screens
  • Type scale: exactly one dominant style per screen, hierarchy squint-tested
  • Shape roles carry meaning: sharp = informational, rounded = tappable
  • Extended FAB owns the single primary action on money screens
  • Every async action has a progress indicator
  • Dark theme verified with Accessibility Scanner at 4.5:1
  • No hardcoded colors outside token files
  • Touch targets ≥48dp, whole-screen migrations only

Why This Converts

The Mumbai checkout story was not about taste. It was about the system communicating the same answer to every user's subconscious question — "what am I supposed to do here, and what happens when I do it?" — consistently, in light and dark, on every device, without a designer in the loop for each edge case. Material 4 hands you a hierarchy, a tonal system, and a set of components that convert attention into action. Use the tokens, respect the contrast, give every screen one obvious action, and measure what changes. The design system is not a skin. It is the first layer of your conversion funnel.

I should be honest about the ceiling of this approach. A consistent, accessible, conversion-focused Material system will not save a product with no clear primary action, no real value proposition, or a checkout flow with five screens of friction. Design-system work compounds only on top of a product that already answers "what am I buying and why should I trust this screen." When I audit an app that converts poorly, I fix the hierarchy and the contrast first — and only then does the design system start paying rent.


*Gulshan Yad

Advanced Navigation Techniques

Material Design 4 introduces several advanced navigation techniques that can help improve the user experience. One of these techniques is the use of a prominent navigation rail with a bottom tab bar. This design pattern simplifies navigation by providing a clear and consistent way to access different sections of the app.

Using a bottom sheet is another advanced navigation technique that can be used to provide an alternative to modal dialogs. A bottom sheet is a persistent, scrollable content pane that can be used to provide additional information or options. This design pattern is particularly useful when you need to provide a lot of information or options, but don't want to interrupt the main flow of the app.

Elevation and Hierarchy

The 'elevated' elevation is a key design element in Material Design 4 that is used to create a sense of depth and hierarchy within the UI. This design element is particularly useful when you need to draw attention to important elements, such as a call-to-action or a navigation menu.

To create a visually appealing navigation rail, use a prominent bottom tab bar with clear and concise labels. Consider adding a search icon or a settings icon to the navigation rail to provide additional functionality.

Button Styles

Material Design 4 introduces several button styles that can be used to enhance visual clarity and improve accessibility. The 'Outlined' button style is used to emphasize the button's function and improve visual clarity, while the 'Filled' button style is used to create a sense of continuity and emphasize interactions.

The 'Icon' button style is used to minimize visual clutter and emphasize action-oriented interactions. This design pattern is particularly useful when you need to provide a lot of options or information, but don't want to clutter the UI.

Advanced Button Interactions

Material Design 4 introduces several advanced button interactions that can be used to enhance the user experience. One of these interactions is the use of a ripple effect to emphasize interactions. This design pattern is particularly useful when you need to draw attention to important elements, such as a call-to-action or a navigation menu.

To apply the ripple effect, use a solid color fill and consider adding a subtle animation to emphasize interactions.

Advanced UI Patterns

Material Design 4 introduces several advanced UI patterns that can be used to enhance the user experience. One of these patterns is the use of a card-based layout to provide a sense of continuity and emphasize interactions.

To create a card-based layout, use a solid color fill and consider adding a subtle animation to emphasize interactions. This design pattern is particularly useful when you need to provide a lot of information or options, but don't want to clutter the UI.

Advanced Color Schemes

Material Design 4 introduces several advanced color schemes that can be used to enhance the user experience. One of these color schemes is the use of a high contrast theme to improve accessibility.

To create a high contrast theme, use a dark background color and a light foreground color. Consider adding a subtle animation to emphasize interactions.

Advanced Typography

Material Design 4 introduces several advanced typography elements that can be used to enhance the user experience. One of these elements is the use of a clear and concise font to improve readability.

To create a clear and concise font, use a sans-serif font and consider adding a subtle animation to emphasize interactions.

Key Takeaways

  • Use a prominent navigation rail with a bottom tab bar to simplify navigation in Material Design 4.
  • Employ a bottom sheet to provide an alternative to modal dialogs and improve screen real estate.
  • Leverage the 'elevated' elevation to create a sense of depth and hierarchy within your UI.
  • Utilize the 'Outlined' button style to enhance visual clarity and improve accessibility.
  • Apply the 'Filled' button style to create a sense of continuity and emphasize interactions.
  • Use the 'Icon' button style to minimize visual clutter and emphasize action-oriented interactions.

Frequently Asked Questions

What is the difference between a bottom sheet and a modal dialog?

A bottom sheet is a persistent, scrollable content pane that can be used to provide additional information or options, whereas a modal dialog is a temporary, non-scrollable content pane that interrupts the main flow of the app.

How do I create a visually appealing navigation rail in Material Design 4?

To create a visually appealing navigation rail, use a prominent bottom tab bar with clear and concise labels, and consider adding a search icon or a settings icon to the navigation rail.

What is the purpose of the 'elevated' elevation in Material Design 4?

The 'elevated' elevation is used to create a sense of depth and hierarchy within the UI, and to draw attention to important elements.

When should I use the 'Outlined' button style in Material Design 4?

Use the 'Outlined' button style when you want to emphasize the button's function and improve visual clarity, such as in a call-to-action or a navigation menu.

How do I apply the 'Filled' button style in Material Design 4?

To apply the 'Filled' button style, use a solid color fill and consider adding a ripple effect to emphasize interactions.

What is the difference between the 'Icon' and 'Filled' button styles in Material Design 4?

The 'Icon' button style is used to minimize visual clutter and emphasize action-oriented interactions, whereas the 'Filled' button style is used to create a sense of continuity and emphasize interactions.

Can I use Material Design 4 in Android apps that are not designed for mobile devices?

Yes, Material Design 4 can be used in Android apps that are not designed for mobile devices, such as wearables or TVs.

How do I ensure accessibility in Material Design 4?

To ensure accessibility in Material Design 4, use clear and concise labels, consider adding a high contrast theme, and ensure that all interactions are accessible via keyboard navigation.

G
Gulshan Yadav

1 followers

AI systems builder · 7 years in production. RAG, self-hosted infra, agent architecture. 📬 Deep-dives → mrgulshanyadav.substack.com

Comments

Sign in to join the conversation

No comments yet. Be the first to share your thoughts!

More from Gulshan Yadav

Recommended for you