Question simple, mais je ne trouve pas de réponse. Comment puis-je réduire ou développer le CollapsingToolbarLayout
programme par programme?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Question simple, mais je ne trouve pas de réponse. Comment puis-je réduire ou développer le CollapsingToolbarLayout
programme par programme?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Réponses:
À l'aide de la bibliothèque de support v23, vous pouvez appeler appBarLayout.setExpanded(true/false)
.
Lectures complémentaires: AppBarLayout.setExpanded (booléen)
J'utilise ce code pour réduire la barre d'outils. Je n'arrive toujours pas à trouver un moyen de l'étendre.
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);
}
}
Edit 1: La même fonction avec une vitesse négative Y mais la barre d'outils n'est pas étendue à 100% et false pour le dernier paramètre devrait fonctionner
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: Ce code fait l'affaire pour moi
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]);
}
}
Je vais essayer de mettre en œuvre Behavior par moi-même.
onNestedFling
sur false
.
onNestedFling
avant de définir le fragment. Après avoir défini le fragment, je pourrais appeler la méthode avec succès.
Vous pouvez définir son expansion ou sa réduction avec votre animateur personnalisé. Utilisez simplement le setTopAndBottomOffset(int)
.
Voici un exemple:
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 )
pour définir valueAnimator.setIntValues
La meilleure solution est celle d'utiliser- ( appBar.getTotalScrollRange() )
J'ai écrit une petite extension sur AppBarLayout
. Il permet d'agrandir et de réduire les CollapsibleToolbarLayout
deux avec et sans animation. Il semble bien faire les choses.
Utilisez-le simplement à la place de votre AppBarLayout
, et vous pouvez appeler des méthodes chargées de développer ou de réduire le fichier CollapsingToolbarLayout
.
Cela fonctionne exactement comme prévu dans mon projet, mais vous devrez peut-être modifier les valeurs de fling / scroll dans les perform...
méthodes (en particulier dans performExpandingWithAnimation()
) pour qu'elles correspondent parfaitement à votre CollapsibleToolbarLayout
.
setExpanded
méthode dans le AppBarLayout
.
Utilisez mAppBarLayout.setExpanded(true)
pour développer la barre d'outils et utilisez mAppBarLayout.setExpanded(false)
pour réduire la barre d'outils.
Si vous souhaitez modifier la hauteur de CollapsingToolbarLayout par programme, utilisez simplement mAppBarLayout.setLayoutParams(params)
;
Développer:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*200; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(true);
Effondrer:
CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*80; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(false);
pour ceux qui veulent travailler avec onNestedPreScroll et obtenir une erreur comme moi. j'obtiens NullPointerException dans onCreate sans cette ligne
CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
//below line
params.setBehavior(new AppBarLayout.Behavior() {});
et ne fonctionne pas correctement avec cela. mais je contourne ce problème avec
dans onCreate:
scrollToolbarOnDelay();
et...
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);
}
Essaye ça...
Développer
appBarLayout.setExpanded(true, true);
Se rappeler
appBarLayout.setExpanded(false, true);
Cela peut aider à développer ou réduire:
appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);