Search code examples
androidandroid-fragmentsandroid-toolbarandroid-appcompatmaterial-components-android

Access Toolbar (MaterialToolbar) from Fragment?


How can I access a Toolbar (actually a MaterialToolbar) from a Fragment using activity.actionBar?

main_layout.xml (extract):

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

        <com.google.android.material.appbar.MaterialToolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            android:background="#ffffff">

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

MainActivity (extract):

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        [..]
        setSupportActionBar(binding.toolbar)
}

MyFragment (extract):

class MyFragment: Fragment() {
    [..]
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val actNull = activity == null
        Timber.i("DEF: activity == null: $actNull")

        var barNull = activity?.actionBar == null
        Timber.i("DEF: activity.actionbar == null: $barNull")
    }
}

Output from the debug statements in the MyFragment:

DEF: activity == null: false
DEF: activity.actionbar == null: true

As I used setSupportActionBar(binding.toolbar) in the MainActivity, shouldn't activity.actionbar be non-null? What am I doing wrong here?

Hint: As far as I know I can alternatively use activity.findViewById(R.id.toolbar). This question is really about why activity.actionBar isn't working.


Solution

  • You can use:

    (activity as AppCompatActivity).supportActionBar
    

    Just a little explanation:

    activity returns a FragmentActivity which handles an android.app.ActionBar.
    You are using an AppCompatActivity which handles an androidx.appcompat.app.ActionBar.
    They are different.