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.
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.