Einfache Frage, aber ich kann keine Antwort finden. Wie kann ich das CollapsingToolbarLayout
programmgesteuert reduzieren oder erweitern ?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Einfache Frage, aber ich kann keine Antwort finden. Wie kann ich das CollapsingToolbarLayout
programmgesteuert reduzieren oder erweitern ?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Antworten:
Mit Support Library v23 können Sie anrufen appBarLayout.setExpanded(true/false)
.
Weiterführende Literatur: AppBarLayout.setExpanded (boolean)
Ich benutze diesen Code zum Reduzieren der Symbolleiste. Ich kann immer noch keinen Weg finden, es zu erweitern.
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);
}
}
Bearbeiten 1: Dieselbe Funktion mit negativer GeschwindigkeitY, aber die Symbolleiste wird nicht um 100% erweitert und false für den letzten Parameter sollte funktionieren
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);
}
}
Edit 2: Dieser Code macht den Trick für mich
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]);
}
}
Ich werde versuchen, das Verhalten selbst umzusetzen.
onNestedFling
auf setzen false
.
onNestedFling
bevor ich das Fragment festlegte . Nachdem ich das Fragment gesetzt hatte, konnte ich die Methode erfolgreich aufrufen.
Sie können mit Ihrem benutzerdefinierten Animator festlegen, um wie viel es erweitert oder reduziert wird. Verwenden Sie einfach die setTopAndBottomOffset(int)
.
Hier ist ein Beispiel:
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 )
zum valueAnimator.setIntValues
- ( appBar.getTotalScrollRange() )
Ich habe eine kleine Erweiterung an geschrieben AppBarLayout
. Es ermöglicht das Erweitern und Reduzieren von CollapsibleToolbarLayout
sowohl mit als auch ohne Animation. Es scheint ganz richtig zu sein.
Verwenden Sie es einfach anstelle von Ihrem AppBarLayout
, und Sie können Methoden aufrufen, die für das Erweitern oder Reduzieren des CollapsingToolbarLayout
.
Es funktioniert genau wie erwartet in meinem Projekt, aber möglicherweise müssen Sie die Fling- / Scroll-Werte in den perform...
Methoden (insbesondere in performExpandingWithAnimation()
) anpassen, um sie perfekt an Ihre anzupassen CollapsibleToolbarLayout
.
setExpanded
Methode in der AppBarLayout
.
Verwenden Sie mAppBarLayout.setExpanded(true)
diese Option, um die Symbolleiste zu erweitern und die Symbolleiste mAppBarLayout.setExpanded(false)
zu reduzieren.
Wenn Sie die Höhe von CollapsingToolbarLayout programmgesteuert ändern möchten, verwenden Sie einfach mAppBarLayout.setLayoutParams(params)
;
Erweitern:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*200; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(true);
Zusammenbruch:
CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*80; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(false);
für diejenigen, die mit onNestedPreScroll arbeiten und Fehler wie ich erhalten möchten. Ich bekomme NullPointerException in onCreate ohne diese Zeile
CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
//below line
params.setBehavior(new AppBarLayout.Behavior() {});
und funktioniert damit nicht richtig. aber ich arbeite mit diesem Problem um
in onCreate:
scrollToolbarOnDelay();
und...
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);
}
Versuche dies...
Erweitern
appBarLayout.setExpanded(true, true);
Zurückrufen
appBarLayout.setExpanded(false, true);
Dies kann helfen, sich auszudehnen oder zusammenzubrechen:
appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);