15

Ich habe ein Fragment, das das neue CoordinatorLayout/AppBarLayout/CollapsingToolbarLayout-Paradigma verwendet, und ich möchte in der Lage sein zu erkennen, wenn die minimierende Symbolleiste vollständig erweitert ist, damit ich eine Operation ausführen kann auf dem gesamten Fragment ist es in, z das Fragment vom Stapel nehmen und zu einem neuen gehen, das Fragment verwerfen. Ich habe den abweisenden Code, ich muss nur wissen, wann und wann ich ihn nicht benutzen soll.Erkennen, wenn AppBarLayout/CollapsingToolbarLayout vollständig erweitert wird

Ich habe ein wenig mit AppBarLayout.OnOffsetChangedListener experimentiert, hatte aber nicht viel Glück. Gibt es eine Möglichkeit, es zu verwenden, um zu bestimmen, wann die Dinge vollständig erweitert sind, oder gibt es eine bevorzugte Methode, die jemand kennt?

Vielen Dank im Voraus!

EDIT: Ich sehe auch, es gibt ein paar Implementierungen für AppBarLayout.setExpanded(...), aber nicht AppBarLayout.getExpanded() oder etwas ähnliches, also bin ich auch dort ratlos.

+0

vielleicht appBarLayout.addOnOffsetChangedListener helfen konnte, aber ich fand es Buggy propably habe ich es nicht richtig implementieren. – mstrengis

+0

Haben Sie eine Lösung dafür gefunden? Ich habe das gleiche Problem bei dem Versuch, zu verhindern, dass ein ScrollRefreshLayout aktualisiert wird, wenn die Symbolleiste teilweise minimiert ist, ausgeführt. – Jimeux

Antwort

26

Es sieht nicht so aus, als gäbe es irgendetwas in den APIs, aber das folgende scheint für mich zu funktionieren. Es könnte Tests erfordern.

boolean fullyExpanded = 
    (appBarLayout.getHeight() - appBarLayout.getBottom()) == 0; 

Edit: Die obige Lösung zu funktionieren scheint, aber da ich diesen Zustand testen wollte, wenn die appbar gescrollt wurde, landete ich mit OnOffsetChangedListener mit folgenden Lösung auf.

class Frag extends Fragment implements AppBarLayout.OnOffsetChangedListener { 

    private boolean appBarIsExpanded = true; 
    private AppBarLayout appBarLayout; 

    @Override 
    public void onActivityCreated(Bundle state) { 
     super.onActivityCreated(state); 
     appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.app_bar); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     appBarLayout.addOnOffsetChangedListener(this); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     appBarLayout.removeOnOffsetChangedListener(this); 
    } 

    @Override 
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
     appBarIsExpanded = (verticalOffset == 0); 
    } 

} 
+0

Am Ende habe ich das Konzept aufgegeben, warum ich das überhaupt machen wollte, aber ich akzeptiere deine Antwort, weil du sagst, dass es für dich funktioniert. Vielen Dank! –

+0

das funktioniert auch nicht für mich. hinzugefügt die Implementierung der Schnittstelle, aber es scheint nicht zu erhalten –

+1

@ user1232726 Sie müssen den Hörer an die AppBarLayout anhängen. Ich habe den Code mit einer Möglichkeit aktualisiert, dies zu tun. Wenn Sie potenzielle Lecks nicht interessiert, wird nur mit "appBarLayout.setOnScrollChangeListener (this)" erledigt. – Jimeux

6

Meine Lösung basiert auf dem Erstellen einer benutzerdefinierten Ansicht. Zuerst eine Klasse erstellen, die native AppBarLayout erstreckt:

public class CustomAppBar extends AppBarLayout { .... 

Dann innerhalb der Klasse eine addOnOffsetChangedListener wie folgt festgelegt:

this.addOnOffsetChangedListener... 

Sie die oben tun kann im Konstruktor durch Setzen oder vielleicht durch ein Verfahren innerhalb Aufruf der Konstruktor. Sie müssen also der Konstruktor, erinnern sich an den Konstruktor mit 2 params verwenden zu können, zu dem XML hinzugefügt:

public CustomAppBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
//You can set the listener here or maybe call the method that set the listener 
} 

Dann müssen wir Zugriff auf den Zustand der Ansicht erhalten, so erstellen eine private boolean in Ihrer benutzerdefinierten Ansicht Klasse, und legen Sie es auf wahr oder falsch, wenn Ihre Sicht in diesem Fall standardmäßig erweitert oder reduziert, beginnt meine Ansicht erweitert ist:

private boolean isExpanded = true; 

Nun müssen Sie den Zustand dieses boolean aktualisieren:

this.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { 
      @Override 
      public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
       if (verticalOffset == 0) { 
        isExpanded = true; 
       } else { 
        isExpanded = false; 
       } 
      } 
     }); 

Der nächste Schritt ist, den Zustand der Booleschen zu erhalten, indem ein Getter in der CustomAppBar-Klasse

public boolean isExpanded() { 
     return isExpanded; 
    } 

Der nächste Schritt ist, um Ihre xml gehen, nutzen Sie Ihre benutzerdefinierte Ansicht gibt, dann in der Akivität oder Fragment erhalten die Aussicht und die Methode verwenden, um den AppBar Status

+0

Das scheint ein Overkill zu sein, wenn Sie einfach einen 'OnOffsetChangedListener' direkt zur' AppBarLayout' Instanz hinzufügen können. –

+0

Wenn Sie dieses AppBarLayout nur einmal verwenden werden: Ja, das ist es. Wenn jedoch mehr als eine Aktivität den Status AppBarLayout kennen muss, dann ist dies eine DRY-Lösung – cutiko

0

ich weiß, dass es vielleicht ein bisschen spät, aber die Erkundung der Quellcode des AppBArLayout ich gefunden habe, zu wissen, dass die AppBarLayout.OnOffsetChangedListener nur den Wert der übersetzt int getTopAndBottomOffset() des Ap pBars Verhalten.

So jederzeit können Sie einfach diesen Code verwenden, um festzulegen, ob ein AppBarLayout oder nicht erweitert:

public boolean isAppBArExpanded(AppBarLayout abl) { 
    final CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) abl.getLayoutParams()).getBehavior(); 
    return (behavior instanceof AppBarLayout.Behavior) ? (((AppBarLayout.Behavior) behavior).getTopAndBottomOffset() == 0) : false; 
} 
Verwandte Themen