Proste pytanie, ale nie mogę znaleźć odpowiedzi. Jak mogę zwinąć lub rozwinąć CollapsingToolbarLayout
programowo?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Proste pytanie, ale nie mogę znaleźć odpowiedzi. Jak mogę zwinąć lub rozwinąć CollapsingToolbarLayout
programowo?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Odpowiedzi:
Korzystając z Support Library v23, możesz zadzwonić appBarLayout.setExpanded(true/false)
.
Dalsze czytanie: AppBarLayout.setExpanded (boolean)
Używam tego kodu do zwijania paska narzędzi. Nadal nie mogę znaleźć sposobu, aby go rozwinąć.
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);
}
}
Edycja 1: Ta sama funkcja z ujemną prędkością Y, ale pasek narzędzi nie jest rozszerzony w 100%, a fałsz dla ostatniego parametru powinien działać
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);
}
}
Edycja 2: ten kod załatwia sprawę za mnie
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]);
}
}
Spróbuję samodzielnie wdrożyć Behavior.
onNestedFling
na false
.
onNestedFling
przed ustawieniem fragmentu. Po ustawieniu fragmentu mogłem pomyślnie wywołać metodę.
Możesz określić, jak bardzo się rozwija lub zwija za pomocą niestandardowego animatora. Po prostu użyj setTopAndBottomOffset(int)
.
Oto przykład:
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 )
do ustawienia valueAnimator.setIntValues
Lepszym rozwiązaniem jest użycie- ( appBar.getTotalScrollRange() )
Napisałem małe rozszerzenie do AppBarLayout
. Pozwala na rozwijanie i zwijanie CollapsibleToolbarLayout
zarówno z animacją, jak i bez niej. Wydaje się, że robi to całkiem dobrze.
Po prostu użyj go zamiast swojego AppBarLayout
i możesz wywołać metody odpowiedzialne za rozwijanie lub zwijanie CollapsingToolbarLayout
.
Działa dokładnie tak, jak oczekiwano w moim projekcie, ale może być konieczne dostosowanie wartości fling / scroll w perform...
metodach (szczególnie w performExpandingWithAnimation()
), aby idealnie pasowały do twojego CollapsibleToolbarLayout
.
setExpanded
metoda w AppBarLayout
.
Służy mAppBarLayout.setExpanded(true)
do rozwijania paska narzędzi i mAppBarLayout.setExpanded(false)
zwijania paska narzędzi.
Jeśli chcesz programowo zmienić wysokość CollapsingToolbarLayout, po prostu użyj mAppBarLayout.setLayoutParams(params)
;
Rozszerzać:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*200; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(true);
Zawalić się:
CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*80; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(false);
dla tych, którzy chcą pracować z onNestedPreScroll i otrzymywać błędy jak ja. dostaję NullPointerException w onCreate bez tej linii
CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
//below line
params.setBehavior(new AppBarLayout.Behavior() {});
i nie działa poprawnie z tym. ale obejdę ten problem z
w onCreate:
scrollToolbarOnDelay();
i...
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);
}
Spróbuj tego...
Rozszerzać
appBarLayout.setExpanded(true, true);
Przypomnieć sobie
appBarLayout.setExpanded(false, true);
Może to pomóc w rozwinięciu lub zwinięciu:
appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);