Antwort

58

UPDATE: Da die Unterstützung Versionen von 23.1.1+ die Frage ist nicht mehr da, keine Notwendigkeit, den Hörer zu verwenden und das Swipe-Refresh-Layout deaktivieren , es wird funktionieren, wie es sollte (link). Implementieren


AppBarLayout.OnOffsetChangedListener Zuhörer auf AppBarLayout

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

und prüfen, ob Offset 0, was bedeutet, die Symbolleiste vollständig erweitert wird.

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

Fully Expanded == 0, diese Antwort ist nicht richtig – Atieh

+1

@Atieh um es weiter zu erklären, wenn die kollabierende Symbolleiste vollständig erweitert ist der Offset-Wert gleich Null (Offset == 0) –

+1

Ich änderte die if-Bedingung in 'verticalOffset < -710' dann ist das Problem gelöst. nicht elegant, aber es funktioniert –

17

Werfen Sie einen Blick auf diesen 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

Sie haben Recht, ich habe Code hinzugefügt, der für die Frage relevant ist. –

+0

Dies funktioniert elegant @EdyBolos dank einer Tonne für das Teilen. Makellos! – Suleiman19

28

Wie Marko sagte, kann dies mit einer eigenen Implementierung eines OnOffsetChangedListener erreicht werden.

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

Dies sollte sei die akzeptierte Antwort! –