Ich habe versucht, die Art und Weise zu reproduzieren, in der die App "Kontakte" in Version 5.0 die Symbolleiste zusammenklappt, wenn die Listenansicht gescrollt wird.Wie kollidiert die Android L Kontakte App ihre Symbolleiste?
Gallery of screenshots demonstrating the desired interaction Beachten Sie den Kollaps der Symbolleiste in Stufen, wo sie Suche + letzten Kontakt anzeigt, letzten Kontakt blendet, letzten Kontakt zusammenbricht, Suche einbricht und nur die Registerkarten übrig lässt.
Bis jetzt habe ich eine Symbolleiste oberhalb einer Recyclerview in einem LinearLayout, und die Symbolleiste wird als Aktionsleiste, nicht Standalone verwendet.
Ich kann nicht herausfinden, wie Sie das Touch-Ereignis in der Recycler-Ansicht abfangen und die Symbolleiste schrumpfen lassen und dann das Scroll-Ereignis an die Recycler-Ansicht zurückgeben. Ich habe versucht, das Ganze in eine Scrollview zu stellen, aber dann konnte die Recyclerview ihre Höhe nicht richtig berechnen und zeigte keinen Inhalt. Ich habe versucht, onscroll auf der Recycler-Ansicht zu übergehen und festgestellt, dass es mich nur benachrichtigt, wenn ein Scroll-Ereignis gestartet wird, und mir die erste sichtbare Karten-ID zur Verfügung stellen.
Die Art und Weise, die gut aussieht, aber ich kann für das Leben von mir nicht bekommen arbeiten, ist dies:
getSupportActionBar().setHideOnContentScrollEnabled(true);
Welche zurück:
Caused by: java.lang.UnsupportedOperationException: Hide on content scroll is not supported in this action bar configuration.
ein traditionelles ActionBar Verwendung, ein Putting Toolbar darunter, und die Einstellung hideoncontentscrollenabled hat ebenfalls nicht funktioniert, das Scrollen hat nie die Methode hide in der Aktionsleiste ausgelöst.
- bearbeiten - Ich konnte HideOnContentScrollEnabled arbeiten auf einer Listview mit einer traditionellen Aktionsleiste, aber das Verhalten ist nicht das gleiche wie die Kontakte App. Dies ist eindeutig nicht die Methode, die sie verwendet haben - es löst einfach .Hide() auf der Aktionsleiste aus, wenn ein Flingereignis in einer Listenansicht auftritt, was sich deutlich von der Kontaktanwendung unterscheidet, die die Symbolleiste zusammen mit dem Bildlaufereignis zieht. -/edit -
Also habe ich diese Route aufgegeben, fill_parent auf die cardview height gesetzt und einen Kollaps auf der Symbolleiste animiert. Aber wie trigge ich es so an, dass es dem Touch-Ereignis folgt und dann das Touch-Ereignis an die Recycler-Ansicht zurückgibt?
activity_main.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/actionBarSize"
android:background="@color/colorPrimary"
/>
<fragment android:name="me.myapplication.FragmentTab"
android:id="@+id/tab_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
fragment_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="8dp"
android:background="#eeeeee"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
styles.xml
...
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
...
Hauptaktivität. java
Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
// Disable the logo in the actionbar, as per material guidelines
toolbar.getMenu().clear();
toolbar.setTitle("My toolbar");
setSupportActionBar(toolbar);
Die App [Google I/O 2014] (https://github.com/google/iosched) verfügt über eine ähnliche Funktion in der Sitzungsansicht. Sie könnten dort einige Ideen finden. –
Danke, ich habe mir den Quellcode und den Effekt angeschaut, aber die iosched-App ist eine andere Art von Effekt und wird auf andere Weise erreicht. Im Grunde animiert es einen 'Verstecken'-Effekt auf der Aktionsleiste, wenn onScroll aufgerufen wird, der nur den ersten Block von Elementen aufnimmt und den Finger nicht wirklich verfolgen kann. Derselbe Effekt kann über setHideOnContentScrollEnabled() angewendet werden. Die Kontakt-App scheint jedoch das gesamte Ansichtsfenster nach oben zu verschieben, bevor das Bildlaufereignis in die Bildlaufansicht zurückkehrt. – Preston
Aus meinem Kopf - was wäre, wenn Sie nicht versuchen würden, die ListView/RecyclerView-Touch-Ereignisse abzufangen, sondern Ihre Ansicht mit einem GestureDetector überlagern und seine bewegten Ereignisse an die rechten Widgets weiterleiten, um sie entsprechend zu verkleinern/zu scrollen? Nur eine Idee, habe das überhaupt nicht ausprobiert. –