Я пытаюсь создать приложение, которое отображает стандартную панель инструментов на всех своих экранах, но когда пользователь переходит на экран 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>