У меня 1 мероприятие с несколькими фрагментами. Для одного из фрагментов я хочу иметь специальную складную панель инструментов. Мне удалось добиться этого, объявив оба AppBarLayouts в одном xml и сделав один из них с видимостью «невидимым». В настоящее время в упражнении у меня есть 2 метода: showStandardToolbar и showSpecialToolbar, которые делают одну из панелей инструментов невидимой, а другую - видимой. Я вызываю эти методы для основной активности из метода onCreate / onStop из specialFragment. Проблема, которая у меня есть, состоит в том, что если панель инструментов развернута, и я перейду к другому фрагменту, фрагмент, к которому я перехожу, будет перемещать свое содержимое вниз на расширенную специальную высоту панели инструментов (правильная панель инструментов отображается, хотя). В методе onStop я пытался закрыть панель инструментов, если она уже развернута, но она не работает (она закрывается только после возврата в специальный фрагмент). В настоящее время «рабочим» решением является разрушение панели инструментов при открытии ящика. Вопрос заключается в следующем: как закрыть панель инструментов при изменении фрагмента?
app_bar_main. xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout ...>
<com.google.android.material.appbar.AppBarLayout
...>
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar_standard"
... />
</com.google.android.material.appbar.AppBarLayout>
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/toolbar_special"
android:visibility="invisible"
...>
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/collapsingToolbarLayout"
...>
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/content_main" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
MainActivity. java
private AppBarLayout standardAppBarLayout;
private AppBarLayout specialAppBarLayout;
private boolean isExpanded = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
toolbarStandard = findViewById(R.id.toolbar_standard);
toolbarSpecial= findViewById(R.id.toolbar_special);
...
// current workaround that I want to get rid of
drawer.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {
@Override
public void onDrawerStateChanged(int newState) {
if (isExpanded) {
// colapse
}
}
});
showStandardToolbar();
}
public void showSpecialToolbar() {
// called from special fragment
standardAppBarLayout.setVisibility(View.INVISIBLE);
specialAppBarLayout.setVisibility(View.VISIBLE);
setupToolbar(toolbarSpecial);
}
public void showStandardToolbar() {
// called from special fragment
specialAppBarLayout.setVisibility(View.INVISIBLE);
standardAppBarLayout.setVisibility(View.VISIBLE);
setupToolbar(toolbarStandard);
}
private void setupToolbar(Toolbar toolbar) {
setSupportActionBar(toolbar);
mAppBarConfiguration = new AppBarConfiguration.Builder(...)
.setDrawerLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
}
SpecialFragment. java
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
...
((MainActivity) getActivity()).showSpecialToolbar();
}
@Override
public void onStop() {
//noinspection ConstantConditions
((MainActivity) getActivity()).showStandardToolbar();
super.onStop();
}
После перехода из специального фрагмента, оставив AppBarLayout расширенным: здесь