Простой вопрос, но я не могу найти ответ. Как я могу свернуть или расширить CollapsingToolbarLayout
программно?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Простой вопрос, но я не могу найти ответ. Как я могу свернуть или расширить CollapsingToolbarLayout
программно?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Ответы:
Используя библиотеку поддержки v23, вы можете позвонить appBarLayout.setExpanded(true/false)
.
Дальнейшее чтение: AppBarLayout.setExpanded (логическое)
Я использую этот код для сворачивания панели инструментов. До сих пор не могу найти способ расширить его.
public void collapseToolbar(){
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
behavior = (AppBarLayout.Behavior) params.getBehavior();
if(behavior!=null) {
behavior.onNestedFling(rootLayout, appbarLayout, null, 0, 10000, true);
}
}
Редактировать 1: та же функция с отрицательной скоростью Y, но панель инструментов не развернута на 100% и значение false для последнего параметра должно работать
public void expandToolbar(){
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
behavior = (AppBarLayout.Behavior) params.getBehavior();
if(behavior!=null) {
behavior.onNestedFling(rootLayout, appbarLayout, null, 0, -10000, false);
}
}
Редактировать 2: этот код для меня
public void expandToolbar(){
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
behavior = (AppBarLayout.Behavior) params.getBehavior();
if(behavior!=null) {
behavior.setTopAndBottomOffset(0);
behavior.onNestedPreScroll(rootLayout, appbarLayout, null, 0, 1, new int[2]);
}
}
Постараюсь реализовать поведение самостоятельно.
onNestedFling
в false
.
onNestedFling
прежде чем установить фрагмент. После установки фрагмента я смог успешно вызвать метод.
Вы можете определить, насколько он расширяется или сворачивается с вашим пользовательским аниматором. Просто используйте setTopAndBottomOffset(int)
.
Вот пример:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams();
final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if (behavior != null) {
ValueAnimator valueAnimator = ValueAnimator.ofInt();
valueAnimator.setInterpolator(new DecelerateInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());
appBar.requestLayout();
}
});
valueAnimator.setIntValues(0, -900);
valueAnimator.setDuration(400);
valueAnimator.start();
}
( -900 )
для установки, valueAnimator.setIntValues
- ( appBar.getTotalScrollRange() )
Я написал небольшое расширение для AppBarLayout
. Это позволяет расширять и сворачивать CollapsibleToolbarLayout
как с, так и без анимации. Кажется, делает это совершенно правильно.
Не стесняйтесь попробовать это.
Просто используйте его вместо своего AppBarLayout
, и вы можете вызывать методы, отвечающие за расширение или свертывание CollapsingToolbarLayout
.
Он работает точно так, как и ожидалось в моем проекте, но вам может понадобиться настроить значения fling / scroll в perform...
методах (особенно в performExpandingWithAnimation()
), чтобы они идеально подходили к вашему CollapsibleToolbarLayout
.
setExpanded
в AppBarLayout
.
Используйте, mAppBarLayout.setExpanded(true)
чтобы развернуть панель инструментов и использовать, mAppBarLayout.setExpanded(false)
чтобы свернуть панель инструментов.
Если вы хотите программно изменить высоту CollapsingToolbarLayout, просто используйте mAppBarLayout.setLayoutParams(params)
;
Expand:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*200; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(true);
Collapse:
CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*80; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(false);
для тех, кто хочет работать с onNestedPreScroll и получить ошибку, как я. я получаю NullPointerException в onCreate без этой строки
CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
//below line
params.setBehavior(new AppBarLayout.Behavior() {});
и не работает должным образом с этим. но я работаю над этой проблемой
в onCreate:
scrollToolbarOnDelay();
и...
public void scrollToolbarOnDelay() {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.tab_appbar);
CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.tab_maincontent);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if(behavior!=null)
behavior.onNestedPreScroll(coordinator, appBarLayout, null, 0, 100, new int[]{0, 0});
else
scrollToolbarOnDelay()
}
}, 100);
}
Попробуй это...
расширять
appBarLayout.setExpanded(true, true);
Перезвонить
appBarLayout.setExpanded(false, true);
Это может помочь расширить или свернуть:
appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);