webentwicklung-frage-antwort-db.com.de

android Lollipop-Symbolleiste: Wie blendet man die Symbolleiste beim Scrollen ein/aus?

Ich verwende das neue Toolbar-Widget, das in appcompat/support-v7 eingeführt wurde. Ich möchte die Symbolleiste ein- oder ausblenden, je nachdem, ob der Benutzer die Seite nach oben/unten durchläuft, genau wie in der neuen Playstore-App von Google oder der NewsStand-App. Gibt es etwas in das Toolbar-Widget dafür oder sollte ich es in Verbindung mit FrameLayout und ObservableScrollView verwenden? 

53
nomongo

Soweit ich weiß, ist nichts eingebaut, was dies für Sie tut. Sie können sich jedoch den Quellcode von Google IO ansehen, insbesondere den BaseActivity . Suchen Sie nach "Auto Hide" oder sehen Sie sich onMainContentScrolled an.

Um die Toolbar zu verbergen, können Sie einfach so etwas tun:

toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start();

Wenn Sie es erneut anzeigen möchten, rufen Sie an:

toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start();
75
Kuno

Zum Ausblenden der Symbolleiste können Sie Folgendes tun:

getSupportActionBar().hide();

Sie müssen also nur einen Scroll-Listener haben und die Symbolleiste ausblenden, wenn der Benutzer blättert!

37
Philippe

Verbergen:

getSupportActionBar().hide();

Show:

getSupportActionBar().show();
24
Andrey

Die Antwort ist einfach. Implementieren Sie einfach OnScrollListenerund verbergen Sie Ihre Symbolleiste im Listener. Wenn Sie beispielsweise listview/recyclerview/gridview haben, folgen Sie dem Beispiel.

Initialisieren Sie in Ihrer MainActivity Oncreate-Methode die Symbolleiste.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        if (toolbar != null) {
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }
}

Und dann die OnScrollListener implementieren

public RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
        boolean hideToolBar = false;
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            if (hideToolBar) {
                ((ActionBarActivity)getActivity()).getSupportActionBar().hide();
            } else {
                ((ActionBarActivity)getActivity()).getSupportActionBar().show();
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            if (dy > 20) {
                hideToolBar = true;

            } else if (dy < -5) {
                hideToolBar = false;
            }
        }
    };

Ich habe die Idee von: https://stackoverflow.com/a/27063901/1079773

16
Abdul Rahman

Die Android Design Support Library kann zum Anzeigen/Ausblenden der Symbolleiste verwendet werden.

Siehe dies . http://Android-developers.blogspot.kr/2015/05/Android-design-support-library.html

Und es gibt detaillierte Beispiele hier . http://inthecheesefactory.com/blog/Android-design-support-library-codelab/de

8
hoi

Es gibt mehrere Möglichkeiten, die Symbolleiste auszublenden/anzuzeigen, während Sie durch den Inhalt blättern. Eine der Möglichkeiten ist, dies über die Android Design Support Library oder genauer über das Coordinator-Layout zu tun. Super-Power-Frame-Layout.

Grundsätzlich müssen Sie lediglich die folgende Struktur in Ihrer Layout-Datei haben und das gewünschte Ergebnis erzielen.

<CoordinatorLayout>
   <AppBarLayout>
   </AppBarLayout>
   <NestedScrollView>
   </NestedScrollView>
</CoordinatorLayout>

Ich habe tatsächlich ein Video gemacht, um zu erklären, wie dies Schritt für Schritt möglich ist. Fühlen Sie sich frei, es zu überprüfen und lassen Sie mich wissen, ob es hilft. Vielen Dank! :)

https://youtu.be/mEGEVeZK7Nw

2
Jack

So blenden Sie das Menü für ein bestimmtes Fragment aus:

 setHasOptionsMenu(true); //Inside of onCreate in FRAGMENT:  


   @Override
   public void onPrepareOptionsMenu(Menu menu) {
       menu.findItem(R.id.action_search).setVisible(false);
   }
1
Parama Sudha

Ich habe versucht, das gleiche Verhalten zu implementieren. Hier ist der Hauptteil des Codes, der die Symbolleiste zeigt und verbirgt (in eine beliebige Klasse einfügen, die Ihre RecyclerView enthält):

int toolbarMarginOffset = 0

private int dp(int inPixels){
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, inPixels, getApplicationContext().getResources().getDisplayMetrics());
}

public RecyclerView.OnScrollListener onScrollListenerToolbarHide = new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        toolbarMarginOffset += dy;
        if(toolbarMarginOffset>dp(48)){
            toolbarMarginOffset = dp(48);
        }
        if(toolbarMarginOffset<0){
            toolbarMarginOffset = 0;
        }
        ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)toolbar.getLayoutParams();
        params.topMargin = -1*toolbarMarginOffset; 
        toolbar.setLayoutParams(params);
    }
};

Ich habe die dp-Funktion zum Konvertieren von Pixeln in dp eingefügt, aber natürlich auf die Höhe der Symbolleiste gesetzt. (Ersetzen Sie dp (48) durch die Höhe Ihrer Symbolleiste.)

Wo auch immer Sie Ihre RecyclerView einrichten:

yourListView.setOnScrollListener(onScrollListenerToolbarHide);

Es gibt jedoch einige zusätzliche Probleme, wenn Sie auch ein SwipeRefreshLayout verwenden.

Ich musste den marginTop des ersten Elements im Adapter für die RecyclerView auf die Höhe der Toolbar plus ursprünglichen Versatz setzen. (Ein bisschen Hack, den ich kenne). Der Grund dafür ist, dass ich feststellte, dass ich, wenn ich meinen obigen Code so geändert habe, dass er die MarginTop des RecyclerView während des Bildlaufs geändert hat, ein jittery Erlebnis war. So habe ich es überwunden. Richten Sie Ihr Layout also im Wesentlichen so ein, dass die Symbolleiste auf der RecyclerView-Oberfläche angezeigt wird (indem Sie sie ausschneiden).

 if(position==0){
     ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)holder.card.getLayoutParams();
     // params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
     params.topMargin = dp(10+48);
 }

Und schließlich, da es einen großen Versatz gibt, wird der RecyclerViews-Aktualisierungskreis abgeschnitten, so dass Sie ihn versetzen müssen (zurück in onCreate Ihrer Klasse, die Ihre RecyclerView hält):

swipeLayout.setProgressViewOffset(true,dp(48),dp(96));

Ich hoffe das hilft jemandem. Es ist meine erste ausführliche Antwort, also hoffe ich, dass ich ausführlich genug war.

1
Timwillhack

Fügen Sie diese Eigenschaft einfach in Ihre Symbolleiste ein und fertig

app:layout_scrollFlags="scroll|enterAlways"

Ist nicht großartig

1
Rishab

Es gibt eine Android-Bibliothek mit dem Namen Android Design Support Library, eine praktische Bibliothek, in der Sie all die Material-Designelemente finden, die in der Material-Dokumentation enthalten sind, ohne dass Sie dazu aufgefordert werden.

Es ist gut dargestellt in diesem Android Blog Post . Insbesondere die "Collapsing Toolbar" ist das, wonach Sie suchen.

0

Eine Bibliothek und Demo mit dem vollständigen Quellcode für Bildlaufleisten oder Kopfzeilen jeder Art können hier heruntergeladen werden:

https://github.com/JohannBlake/JBHeaderScroll

Kopfzeilen können Symbolleisten, LinearLayouts, RelativeLayouts oder die Art der Ansicht sein, die Sie zum Erstellen einer Kopfzeile verwenden.

Der scrollbare Bereich kann ein beliebiger Typ von Scrollinhalten sein, einschließlich ListView, ScrollView, WebView, RecyclerView, RelativeLayout, LinearLayout oder was immer Sie möchten.

Es gibt sogar Unterstützung für verschachtelte Header.

Es ist in der Tat ein komplexes Unterfangen, Kopfzeilen (Symbolleisten) und scrollbare Inhalte auf die gleiche Weise wie in Google Newsstand zu synchronisieren.

Diese Bibliothek erfordert keine Implementierung von onScrollListener.

Bei den oben aufgeführten Lösungen handelt es sich nur um halbgebackene Lösungen, bei denen nicht berücksichtigt wird, dass der obere Rand des scrollbaren Inhaltsbereichs unterhalb der Symbolleiste zunächst am unteren Rand der Symbolleiste ausgerichtet werden muss und dann beim Scrollen der Inhaltsbereich benötigt wird neu positioniert und möglicherweise neu dimensioniert werden. Die JBHeaderScroll behandelt alle diese Probleme.

0
AndroidDev

Ich habe eine Utility-Klasse implementiert, um die gesamte Toolbar-Animation beim Scrollen ein-/ausblenden zu können. Den Artikel finden Sie hier http://rylexr.tinbytes.com/2015/04/27/how-to-hideshow-Android-toolbar-when-scrolling-google-play-musics-behavior/ . Der Quellcode ist hier https://github.com/rylexr/Android-show-hide-toolbar .

0
rylexr