Pergunta simples, mas não consigo encontrar uma resposta. Como posso recolher ou expandir CollapsingToolbarLayout
programaticamente?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Pergunta simples, mas não consigo encontrar uma resposta. Como posso recolher ou expandir CollapsingToolbarLayout
programaticamente?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Respostas:
Usando a Biblioteca de suporte v23, você pode ligar appBarLayout.setExpanded(true/false)
.
Leitura adicional: AppBarLayout.setExpanded (boolean)
Eu uso esse código para recolher a barra de ferramentas. Ainda não conseguiu encontrar uma maneira de expandi-lo.
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: A mesma função com velocidade negativaY, mas a barra de ferramentas não é expandida 100% e false para o último parâmetro deve funcionar
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: Este código faz o truque para mim
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]);
}
}
Tentarei implementar o comportamento sozinho.
onNestedFling
como false
.
onNestedFling
antes de definir o fragmento. Depois de definir o fragmento, eu poderia chamar o método com sucesso.
Você pode definir o quanto ele se expande ou entra em colapso com seu animador personalizado. Basta usar o setTopAndBottomOffset(int)
.
Aqui está um exemplo:
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 )
para definir valueAnimator.setIntValues
A solução do - ( appBar.getTotalScrollRange() )
Eu escrevi uma pequena extensão para AppBarLayout
. Permite a expansão e o colapso de CollapsibleToolbarLayout
ambos com e sem animação. Parece estar fazendo tudo certo.
Sinta-se livre para experimentar.
Basta usá-lo em vez do seu AppBarLayout
e poderá chamar métodos responsáveis pela expansão ou recolhimento do CollapsingToolbarLayout
.
Está funcionando exatamente como o esperado no meu projeto, mas você pode precisar ajustar os valores de arremesso / rolagem nos perform...
métodos (especialmente em performExpandingWithAnimation()
) para se ajustar perfeitamente ao seu CollapsibleToolbarLayout
.
setExpanded
método no AppBarLayout
.
Use mAppBarLayout.setExpanded(true)
para expandir a Barra de Ferramentas e use mAppBarLayout.setExpanded(false)
para recolher a Barra de Ferramentas.
Se você deseja alterar a altura de CollapsingToolbarLayout programaticamente, basta usar mAppBarLayout.setLayoutParams(params)
;
Expandir:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*200; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(true);
Colapso:
CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*80; // HEIGHT
mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(false);
para aqueles que querem trabalhar com onNestedPreScroll e obter erros como eu. eu recebo NullPointerException no onCreate com esta linha
CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
//below line
params.setBehavior(new AppBarLayout.Behavior() {});
e não funciona corretamente com isso. mas eu trabalho em torno deste problema com
em onCreate:
scrollToolbarOnDelay();
e...
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);
}
Tente isso ...
Expandir
appBarLayout.setExpanded(true, true);
Recolher
appBarLayout.setExpanded(false, true);
Isso pode ajudar a expandir ou contrair:
appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);