Как реализовать Collapsing Toolbar только в определенных фрагментах - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь создать приложение, которое отображает стандартную панель инструментов на всех своих экранах, но когда пользователь переходит на экран B, я хочу отобразить свертывающуюся панель инструментов, которая будет отображать дополнительную информацию для пользователя.

Проблема в том, что я придерживаюсь соглашения, согласно которому одно действие содержит все общие представления (панель инструментов, нижняя панель приложения, FAB и т. Д.) И заменяет фрагменты в середине действия при переходе пользователя к другомуэкраны.Я использую компонент навигации для достижения этой цели.К сожалению, у общей панели инструментов есть проблема:

  • Это либо стандартная панель инструментов для всех экранов, либо складная панель инструментов для всех экранов.

Я пытался спрятать все внутри сворачиваемой панели инструментов, когда свертывание не требуется (чтобы предотвратить эффект свертывания), но это привело к тому, что на панели инструментов вообще не было заголовка.Скорее всего, это связано с самим компонентом навигации.

Я также думал о том, чтобы свернуть панель инструментов внутри нужного фрагмента и просто спрятать основную панель инструментов в onResume, но сам макет не будет соответствующим образом корректироваться.

Знаете ли вы, какие другие подходы могут быть использованы для решения этой проблемы?Простейшим подходом было бы просто иметь отдельную панель инструментов для каждого отдельного фрагмента, но это будет много дублировать код, и я пытаюсь избежать этого.

Подобные вопросы по StackOverflow не помогли решить эту проблему в моем случае.

В приведенном ниже коде нет всех тех вещей, которые я пытался решить, поскольку они не работали, поэтому я удалил эти изменения.

Основная деятельность

class MainActivity : AppCompatActivity(), OnActivityComponentRequest, NavController.OnDestinationChangedListener {

    private lateinit var floatingActionButton: FloatingActionButton
    private lateinit var appBarLayout: AppBarLayout
    private lateinit var navHostFragment: View

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        floatingActionButton = fab
        appBarLayout = app_bar_layout
        navHostFragment = include

        setSupportActionBar(toolbar)

        val navigationController = Navigation.findNavController(this, R.id.nav_host_fragment)
        val appBarConfiguration = AppBarConfiguration(navigationController.graph)

        toolbar.setupWithNavController(navigationController, appBarConfiguration)
        navigationController.addOnDestinationChangedListener(this)
    }

    override fun onDestinationChanged(controller: NavController, destination: NavDestination, arguments: Bundle?) {
        Log.d("MainActivity", "Destination has been changed $destination")
    }

    override fun getFap(): FloatingActionButton {
        return this.floatingActionButton
    }

    override fun hideCollapsableItem() {
        appBarLayout.isGone = !appBarLayout.isGone
        navHostFragment.layout.maxHeight = LinearLayout.LayoutParams.MATCH_PARENT
        navHostFragment.layout.maxWidth = LinearLayout.LayoutParams.MATCH_PARENT
    }
}

action_main XML Layout

<?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=".domain.MainActivity"
        android:animateLayoutChanges="true">

    <com.google.android.material.appbar.AppBarLayout
            android:id="@+id/app_bar_layout"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:theme="@style/AppTheme.AppBarOverlay">

        <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|enterAlways"
                app:popupTheme="@style/AppTheme.PopupOverlay"/>

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

    <include
            layout="@layout/content_main"
            android:id="@+id/include"
            />

    <com.google.android.material.bottomappbar.BottomAppBar
            android:id="@+id/bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"/>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_anchorGravity="right|top"
            app:layout_anchor="@+id/bar"
            android:src="@drawable/ic_add_black_24dp"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

contenxt_main XML

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/activity_main"
tools:context=".domain.MainActivity">

    <fragment
            android:id="@+id/nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:navGraph="@navigation/main_navigation" />

</FrameLayout>
...