risposta

58

UPDATE: Dal momento che le versioni di supporto di 23.1.1+ il problema non c'è più, non c'è bisogno di usare l'ascoltatore e disattivare il layout di aggiornamento colpo , funzionerà come dovrebbe (link).


Implementare AppBarLayout.OnOffsetChangedListener ascoltatore sul AppBarLayout

AppBarLayout appBarLayout = (AppBarLayout) view.findViewById(R.id.app_bar_layout); 
appBarLayout.addOnOffsetChangedListener(this); 

e verificare se offset è 0, cioè la barra degli strumenti è completamente espanso.

@Override 
public void onOffsetChanged(AppBarLayout appBarLayout, int offset) 
{ 
    if (offset == 0) 
    { 
     // Fully expanded 
    } 
    else 
    { 
     // Not fully expanded or collapsed 
    } 
} 
+24

Completamente espanso == 0, questa risposta non è corretta – Atieh

+1

@Atieh per spiegarlo ulteriormente, quando la barra degli strumenti comprendente è completamente espansa il valore di offset è uguale a zero (offset == 0) –

+1

Ho cambiato la condizione if in verticaleOffset < -710' quindi il problema risolto. non elegante ma funziona –

17

Date un'occhiata su questo github gist

public class MyAppBarLayout extends AppBarLayout 
     implements AppBarLayout.OnOffsetChangedListener { 

    private State state; 
    private OnStateChangeListener onStateChangeListener; 

    public MyAppBarLayout(Context context) { 
     super(context); 
    } 

    public MyAppBarLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     if (!(getLayoutParams() instanceof CoordinatorLayout.LayoutParams) 
       || !(getParent() instanceof CoordinatorLayout)) { 
      throw new IllegalStateException(
        "MyAppBarLayout must be a direct child of CoordinatorLayout."); 
     } 
     addOnOffsetChangedListener(this); 
    } 

    @Override 
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
     if (verticalOffset == 0) { 
      if (onStateChangeListener != null && state != State.EXPANDED) { 
       onStateChangeListener.onStateChange(State.EXPANDED); 
      } 
      state = State.EXPANDED; 
     } else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) { 
      if (onStateChangeListener != null && state != State.COLLAPSED) { 
       onStateChangeListener.onStateChange(State.COLLAPSED); 
      } 
      state = State.COLLAPSED; 
     } else { 
      if (onStateChangeListener != null && state != State.IDLE) { 
       onStateChangeListener.onStateChange(State.IDLE); 
      } 
      state = State.IDLE; 
     } 
    } 

    public void setOnStateChangeListener(OnStateChangeListener listener) { 
     this.onStateChangeListener = listener; 
    } 

    public interface OnStateChangeListener { 
     void onStateChange(State toolbarChange); 
    } 

    public enum State { 
     COLLAPSED, 
     EXPANDED, 
     IDLE 
    } 
} 
+1

Hai ragione, ho aggiunto il codice pertinente alla domanda. –

+0

Funziona elegantemente @EdyBolos grazie mille per la condivisione. Flawless! – Suleiman19

28

Come ha detto Marko, questo può essere ottenuto utilizzando la propria implementazione di OnOffsetChangedListener.

AppBarLayout appBarLayout = (AppBarLayout) view.findViewById(R.id.app_bar_layout); 
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { 
     @Override 
     public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
      if (Math.abs(verticalOffset) == appBarLayout.getTotalScrollRange()) { 
       // Collapsed 
      } else if (verticalOffset == 0) { 
       // Expanded 
      } else { 
       // Somewhere in between 
      } 
     } 
    });); 
+1

Questo dovrebbe essere la risposta accettata! –

Problemi correlati