Просте запитання, але я не можу знайти відповіді. Як я можу програмно згортати чи розширювати 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%, і помилка для останньої парами повинна працювати
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)
;
Розгорнути:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*200; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(true);
Згорнути:
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);