从 Fragment 访问工具栏(MaterialToolbar)?

Access Toolbar (MaterialToolbar) from Fragment?

如何使用 activity.actionBarFragment 访问 Toolbar(实际上是 MaterialToolbar)?

main_layout.xml(摘录):

<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(摘录):

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

MyFragment(摘录):

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")
    }
}

MyFragment 中调试语句的输出:

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

因为我在 MainActivity 中使用了 setSupportActionBar(binding.toolbar)activity.actionbar 不应该是非空的吗?我在这里做错了什么?

提示:据我所知,我也可以使用 activity.findViewById(R.id.toolbar)。这个问题实际上是关于为什么 activity.actionBar 不起作用。

您可以使用:

(activity as AppCompatActivity).supportActionBar

稍微解释一下:

activity returns 处理 android.app.ActionBar.
FragmentActivity 您正在使用 AppCompatActivity 来处理 androidx.appcompat.app.ActionBar.
他们是不同的。