Обнаружение, когда AppBarLayout/CollapsingToolbarLayout полностью расширен

У меня есть фрагмент, который использует новую парадигму CoordinatorLayout/AppBarLayout/CollapsingToolbarLayout, и я хотел бы иметь возможность определить, когда панель инструментов collapsing полностью расширена, чтобы я мог выполнить операцию над всем фрагментом, в котором он находится, например, вытащить фрагмент из стека и перейти к новому, отклоняя фрагмент. У меня работает код увольнения, мне просто нужно знать, когда и когда его не использовать.

Я немного экспериментировал с AppBarLayout.OnOffsetChangedListener, но не очень повезло. Есть ли способ использовать его, чтобы определить, когда вещи полностью расширены, или есть более предпочтительный метод, о котором кто-то знает?

спасибо заранее!

изменить: Я также вижу, что есть пара реализаций для AppBarLayout.setExpanded(...), однако не AppBarLayout.getExpanded () или что-то подобное, поэтому я тоже в тупике.

3 ответов


не похоже, что в API что-то есть, но следующее, похоже, работает для меня. Это, возможно, потребуется тестирование.

boolean fullyExpanded =
    (appBarLayout.getHeight() - appBarLayout.getBottom()) == 0;

Edit: вышеуказанное решение, похоже, работает, но поскольку я хотел проверить это условие, когда прокручивалась панель приложений, я использовал следующее решение с OnOffsetChangedListener.

class Frag extends Fragment implements AppBarLayout.OnOffsetChangedListener {

    private boolean appBarIsExpanded = true;
    private AppBarLayout appBarLayout;

    @Override 
    public void onActivityCreated(Bundle state) {
        super.onActivityCreated(state);
        appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.app_bar);
    }

    @Override
    public void onResume() {
        super.onResume();
        appBarLayout.addOnOffsetChangedListener(this);
    }

    @Override
    public void onStop() {
        super.onStop();
        appBarLayout.removeOnOffsetChangedListener(this);
    }

    @Override
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
        appBarIsExpanded = (verticalOffset == 0);
    } 

}

мое решение основано на создании пользовательского представления. Сначала создайте класс, расширяющий собственный AppBarLayout:

public class CustomAppBar extends AppBarLayout { ....

затем внутри класса установите addOnOffsetChangedListener следующим образом:

this.addOnOffsetChangedListener...

вы можете сделать это, установив в конструкторе или, возможно, вызвав метод внутри конструктора. Поэтому вам нужен конструктор,не забудьте использовать конструктор с 2 парами, чтобы иметь возможность добавлять в xml:

public CustomAppBar(Context context, AttributeSet attrs) {
        super(context, attrs);
//You can set the listener here or maybe call the method that set the listener
}

затем мы необходимо получить доступ к состоянию представления, поэтому создайте частное логическое значение внутри пользовательского класса представления и установите его в true или false, если ваше представление начало расширено или свернуто, в этом случае мое представление по умолчанию расширено:

private boolean isExpanded = true;

теперь вам нужно обновить состояние этого логического:

this.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                if (verticalOffset == 0) {
                    isExpanded = true;
                } else {
                    isExpanded = false;
                }
            }
        });

следующий шаг-получить состояние boolean с помощью геттера внутри класса CustomAppBar

public boolean isExpanded() {
        return isExpanded;
    }

далее перейдите к xml, используйте свой пользовательский вид там, то в Acivity или фрагмент получить представление и использовать метод, чтобы узнать состояние AppBar


Я знаю, что это может быть немного поздно, но, исследуя исходный код AppBArLayout, я обнаружил, что AppBarLayout.OnOffsetChangedListener просто переводит значение int getTopAndBottomOffset () поведения AppBar.

поэтому в любое время вы можете просто использовать этот код, чтобы определить, расширен ли AppBarLayout или нет:

public boolean isAppBArExpanded(AppBarLayout abl) {
    final CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) abl.getLayoutParams()).getBehavior();
    return (behavior instanceof AppBarLayout.Behavior) ? (((AppBarLayout.Behavior) behavior).getTopAndBottomOffset() == 0) : false;
}