Обнаружение, когда 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;
}