Proste pytanie, ale nie mogę znaleźć odpowiedzi. Jak mogę zwinąć lub rozwinąć CollapsingToolbarLayoutprogramowo?

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

Proste pytanie, ale nie mogę znaleźć odpowiedzi. Jak mogę zwinąć lub rozwinąć CollapsingToolbarLayoutprogramowo?

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

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.
onNestedFlingna 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.setIntValuesLepszym rozwiązaniem jest użycie- ( appBar.getTotalScrollRange() )
Napisałem małe rozszerzenie do AppBarLayout. Pozwala na rozwijanie i zwijanie CollapsibleToolbarLayoutzarówno z animacją, jak i bez niej. Wydaje się, że robi to całkiem dobrze.
Po prostu użyj go zamiast swojego AppBarLayouti 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.
setExpandedmetoda 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);