Android Native - How to Add Material 3 Top App Bar

dimitrilc 2 Tallied Votes 3K Views Share

Introduction

The release of Android 12 also came together with Material 3. Whether you love it or hate it, it is likely to be here to stay for a couple of years, therefore, it would be useful to know how to use it. In this tutorial, we will learn how to enable Material 3 themes and how to add the Material 3 Top App Bar into our app.

Goals

At the end of the tutorial, you would have learned:

  1. How to subclass a Material 3 theme.
  2. How to add Material 3 Top App Bar.

Tools Required

  1. Android Studio. The version used in this tutorial is Arctic Fox 2020.3.1 Patch 4.

Prerequisite Knowledge

  1. Basic Android.

Project Setup

To follow along with the tutorial, perform the steps below:

  1. Create a new Android project with the default Empty Activity.

Inherit Material 3 Theme

It is recommended that you apply an app-wide Material 3 theme before using any Material 3 component. Because we wanted to use the Material 3 Top App Bar, we should apply a theme such as Theme.Material3.DayNight.NoActionBar to our App.

  1. In your current project, navigate to res > values > themes.

  2. Open up both themes.xml and themes.xml (night).

  3. Inspect both files. Notice that both of their <style> elements have Theme.MaterialComponents.DayNight.DarkActionBar as the parent. This is only true on my build of Android Studio. If you are using a newer build in the future, you might see a different parent theme. The current theme is a Material 2 theme, so we will need to upgrade it to Material 3 that supports a Top App Bar.

     <style name="Theme.DaniwebAndroidMaterial3TopAppBar" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
  4. Replace the current value of the parent attribute with Theme.Material3.DayNight.NoActionBar for both XML files. This theme does not contain an ActionBar, which allows us to add a Top App Bar that conforms to Material 3 guidelines.

  5. Both of your <style> elements should look similar to this.

     <style name="Theme.DaniwebAndroidMaterial3TopAppBar" parent="Theme.Material3.DayNight.NoActionBar">
  6. But the code will not compile yet because you must add the gradle dependency for Material 3. Open up your gradle module file and replace the current material dependency of implementation 'com.google.android.material:material:1.4.0'to

     implementation' com.google.android.material:material:1.5.0-rc01'
  7. Sync the project.

  8. Run the app now and you can see that the old Action Bar is gone. The background color is also a little bit different, too.

10000201000002F600000326DF919741D4D5F1C0.png

Material 3 Top App Bar

There are many variants of the Top App Bar:

  1. Center aligned.
  2. Small.
  3. Medium.
  4. Large.

1000020100000184000001D9A011BFE668CF7C73.png

For this tutorial, we will add the center-aligned Top App Bar. Follow the steps below to add it to our app:

  1. Open up activity_main.xml in the Design view.

  2. Under the Component Tree, Right-click on ConstraintLayout > Convert view….
    10000201000001870000012397161C328A901CB1.png

  3. Select CoordinatorLayout > Apply.
    10000201000001ED000000C73E800DC420CFA532.png

  4. Switch to Code view.

  5. Add an <AppBarLayout> child to the <CoordinatorLayout>.

     <com.google.android.material.appbar.AppBarLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
    
     </com.google.android.material.appbar.AppBarLayout>
  6. Add a <MaterialToolBar> child to <AppBarLayout>.

     <com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/topAppBar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:title="@string/page_title"
        app:titleCentered="true"
        app:menu="@menu/top_app_bar"
        app:navigationIcon="@drawable/ic_baseline_menu_24" />
  7. Add the string resource below to strings.xml.

     <string name="page_title">App Brand</string>
  8. Create a new xml resource for the menu by right-clicking on res > New > Android Resource File. Use the configuration from the screenshot below, select OK.
    100002010000040300000250CD341651C7332B4C.png

  9. Create a new drawable for the navigation icon by right-clicking on drawable > New > Vector Asset. Use the configuration from the screenshot below, and then select Next > Finish.
    1000020100000350000001CB6BC6276F2DE66846.png

  10. Remove the default “Hello World!” TextView.

Run the App

We are now ready to run the app, so run it now and we can see that we have a centered Top App Bar from the Material 3 library.

10000201000001940000034E7C9F50B56EFC9AD8.png

Solution Code

ic_baseline_menu_24.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
   android:width="24dp"
   android:height="24dp"
   android:viewportWidth="24"
   android:viewportHeight="24"
   android:tint="?attr/colorControlNormal">
 <path
     android:fillColor="@android:color/white"
     android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z"/>
</vector>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">

   <com.google.android.material.appbar.AppBarLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">

       <com.google.android.material.appbar.MaterialToolbar
           android:id="@+id/topAppBar"
           android:layout_width="match_parent"
           android:layout_height="?attr/actionBarSize"
           app:title="@string/page_title"
           app:titleCentered="true"
           app:menu="@menu/top_app_bar"
           app:navigationIcon="@drawable/ic_baseline_menu_24" />

   </com.google.android.material.appbar.AppBarLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

top_app_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

</menu>

strings.xml

<resources>
   <string name="app_name">DaniwebAndroid Material 3 Top App Bar</string>
   <string name="page_title">App Brand</string>
</resources>

themes.xml

<resources xmlns:tools="http://schemas.android.com/tools">
   <!-- Base application theme. -->
   <style name="Theme.DaniwebAndroidMaterial3TopAppBar" parent="Theme.Material3.DayNight.NoActionBar">
       <!-- Primary brand color. -->
       <item name="colorPrimary">@color/purple_500</item>
       <item name="colorPrimaryVariant">@color/purple_700</item>
       <item name="colorOnPrimary">@color/white</item>
       <!-- Secondary brand color. -->
       <item name="colorSecondary">@color/teal_200</item>
       <item name="colorSecondaryVariant">@color/teal_700</item>
       <item name="colorOnSecondary">@color/black</item>
       <!-- Status bar color. -->
       <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
       <!-- Customize your theme here. -->
   </style>
</resources>

build.gradle

plugins {
   id 'com.android.application'
   id 'kotlin-android'
}

android {
   compileSdk 31

   defaultConfig {
       applicationId "com.example.daniwebandroidmaterial3topappbar"
       minSdk 21
       targetSdk 31
       versionCode 1
       versionName "1.0"

       testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
   }

   buildTypes {
       release {
           minifyEnabled false
           proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
       }
   }
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }
   kotlinOptions {
       jvmTarget = '1.8'
   }
}

dependencies {

   implementation 'androidx.core:core-ktx:1.7.0'
   implementation 'androidx.appcompat:appcompat:1.4.0'
   implementation 'com.google.android.material:material:1.5.0-rc01'
   implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
   testImplementation 'junit:junit:4.+'
   androidTestImplementation 'androidx.test.ext:junit:1.1.3'
   androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

Summary

We have learned how to add a Material 3 Top App Bar into our App. The full project code can be found at https://github.com/dmitrilc/DaniwebAndroidMaterial3TopAppBar

Dani AI

Generated

’s steps still work, but a few 2025 updates will make your M3 top app bar look and behave more like modern Android.

  • Use the current Material Components release. As of Sep 3, 2025 the latest stable is 1.13.0, so prefer implementation("com.google.android.material:material:1.13.0") over older RCs. This also raises some build/tooling baselines and fixes a lot of TopAppBar behaviors. (github.com)
  • In M3, components read the newer color roles (for example, colorPrimaryContainer, colorOnSurfaceVariant) rather than M2-only variants. If your theme still sets colorPrimaryVariant/colorSecondaryVariant, they will not influence most M3 widgets; define the M3 roles instead. (github.com)
  • If you want Material You dynamic color, enable it once in your Application via DynamicColors.applyToActivitiesIfAvailable(this). (developer.android.com)

For correct scrolling and insets, wire the app bar to CoordinatorLayout and go edge-to-edge:

<androidx.coordinatorlayout.widget.CoordinatorLayout ...>

  <com.google.android.material.appbar.AppBarLayout
      android:id="@+id/appBar"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:fitsSystemWindows="true">

    <com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/topAppBar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:titleCentered="true"
        app:layout_scrollFlags="scroll|enterAlways"/>
  </com.google.android.material.appbar.AppBarLayout>

  <androidx.core.widget.NestedScrollView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>
  • On Android 15+ with targetSdk 35, edge-to-edge is enforced. For older versions, call WindowCompat.enableEdgeToEdge(window) and let AppBarLayout handle the inset. (developer.android.com)
override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  WindowCompat.enableEdgeToEdge(window) // edge-to-edge
  findViewById<AppBarLayout>(R.id.appBar).statusBarForeground =
      MaterialShapeDrawable.createWithElevationOverlay(this) // match status bar to bar
}

Notes:

  • app:titleCentered="true" is supported directly by MaterialToolbar. (developer.android.com)
  • To keep icons readable, set app:navigationIconTint/app:titleTextColor as needed after you switch to M3 color roles. (developer.android.com)
Advika_1 0 Newbie Poster

This guide still holds up really well! The update about using the newer Material 3 roles and edge-to-edge layout is super helpful. It’s great to see how Android UI is evolving toward cleaner, more adaptive design.

Advika_1 0 Newbie Poster

Nice breakdown, the design flow here feels similar to Remaker AI’s approach to adaptive visuals: clean structure, dynamic styling, and precision in layout. Both focus on modern consistency and user-centric design.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.