Доступ к панели инструментов (MaterialToolbar) из фрагмента? - PullRequest
0 голосов
/ 06 августа 2020

Как я могу получить доступ к Toolbar (на самом деле MaterialToolbar) из Fragment, используя activity.actionBar?

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

Поскольку я использовал setSupportActionBar(binding.toolbar) в MainActivity, не должно ли activity.actionbar быть ненулевым? Что я здесь делаю не так?

Подсказка: насколько мне известно, в качестве альтернативы я могу использовать activity.findViewById(R.id.toolbar). Этот вопрос действительно о том, почему activity.actionBar не работает.

1 Ответ

2 голосов
/ 06 августа 2020

Вы можете использовать:

(activity as AppCompatActivity).supportActionBar

Небольшое пояснение:

activity возвращает FragmentActivity, который обрабатывает android.app.ActionBar. Вы используете AppCompatActivity, который обрабатывает androidx.appcompat.app.ActionBar. Они разные.

...