Как свернуть AppBarLayout при переключении на другой фрагмент? - PullRequest
0 голосов
/ 08 января 2020

У меня 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 расширенным: здесь

...