Android - FAB, um beim Navigieren zwischen verschiedenen Fragmenten in einem Viewpager zu verbergen

8

Ich versuche etwas wirklich Einfaches zu tun.

Ich möchte, dass der FAB nur auf einem Tab in meinem TabLayout erscheint und ausgeblendet wird, wenn ich zu einem anderen Tab navigiere. So könnten Sie beispielsweise auf einer Registerkarte neue Elemente im FAB hinzufügen, aber auf der nächsten Registerkarte können Sie keine Elemente hinzufügen.

Ich habe das "typische" XML-Design-Layout verfolgt:

%Vor%

Ich habe das folgende Verhalten für den FAB verwendet. Dies führt dazu, dass Upscrolls bewirken, dass der FAB verschwindet und auf einem Downscroll zurück auf den Bildschirm kommt:

%Vor%

Ich habe einen viewpager addOnPageChangeListener hinzugefügt:

%Vor%

Ich möchte nur, dass der FAB auf der ersten Seite erscheint und auf allen anderen Seiten verschwindet.

Der Code funktioniert, aber wenn ich auf der nächsten Seite wische, erscheint der FAB nach, obwohl die Sichtbarkeit deaktiviert ist. Ich denke, es hat etwas mit dem Verhalten zu tun, das für den FAB festgelegt wurde. Weiß jemand, warum die FAB immer noch sichtbar ist, wenn die Sichtbarkeit nicht mehr sichtbar ist?

    
Simon 16.07.2015, 14:28
quelle

6 Antworten

7

Dies endete nicht als etwas, das ich in meiner App implementieren möchte, aber ich habe es geschafft, am Ende eine Antwort zu finden, mit etwas Hilfe, indem ich mir anschaute, wie sie dasselbe in der Wordpress App implementiert haben.

>

In der Wordpress-App sehen wir auf der ersten Seite der App eine schwebende Aktionsschaltfläche, die verschwindet, wenn Sie auf eine der anderen Seiten im viewpager wischen:

Sie haben dies über den folgenden Code getan - das ist der Code für die Aktivität, die den Viewpager enthält. Sie können den relevanten Teil des Codes unter der onPageScrolled-Methode sehen, die den Eventbus enthält, der jedes Mal ein Ereignis sendet, wenn die Seite gescrollt wird. Das Ereignis enthält nur eine Variable namens positionOffset, die ein ganzzahliger Wert von 0 bis 1 ist. Wenn Sie scrollen und die Seite auf halber Strecke zwischen den beiden Viewpagern liegt, beträgt der positionOffset 0,5, und Sie erhalten folgende Idee:

WPMainActivity.java

%Vor%

Das Ereignis wird in dem Fragment aufgenommen, das den folgenden Code enthält. Das Ereignis löst die translationY-Methode aus, die das FAB vertikal animiert, wenn die Seite gescrollt wird, je nachdem, wie weit die Seite durch die PositionOffset:

verschoben wurde

MySiteFragment

%Vor%

Schließlich zeigt das Layout in der my_site_fragment.xml , dass der FAB tatsächlich in das Fragment xml anstelle der Aktivität xml eingefügt wird.

%Vor%     
Simon 06.11.2015, 11:44
quelle
3

Hey, ich hatte genau das gleiche Problem wie du.

Ich habe zwei Methoden gefunden, die für mich funktionierten.

Methode 1:

Fügen Sie in Ihrer MainActivity ein statisches Flag hinzu: public static boolean fabVisible; .

Ich habe bemerkt, dass Sie einen Listener für Ihre viewPager haben, um die aktuelle Fragmentseite zu erkennen, also können Sie Folgendes hinzufügen:

%Vor%

Fügen Sie in Ihrem benutzerdefinierten Fab-Verhalten den folgenden Code hinzu:

%Vor%

Der Zweck dieser Methode besteht darin, sicherzustellen, dass die Fab sichtbar sein sollte, bevor Sie die Verstecken & Amp; Zeige Methode.

Methode 2:

Sie müssen keine Markierung wie "fabVisible" mehr in Ihrem MainActivity hinzufügen. Bei dieser Methode müssen Sie viewPager jedoch in Ihrem MainActivity als statisch festlegen, da wir in unserer benutzerdefinierten Fab-Verhaltensklasse darauf zugreifen können müssen.

Fügen Sie in Ihrer ScrollAwareFABBehavior -Klasse den folgenden Code hinzu:

%Vor%

Der Schlüsselpunkt dieser Methode besteht nur darin, die Methode zum Ein- und Ausblenden zu machen, wenn Sie sich in dem gewünschten Fragment befinden (in meinem Fall ist es Fragment eins, also das currenItem == 0). Um das Fab im zweiten Fragment zu entfernen, müssen Sie es natürlich weiterhin in Ihrem viewPager-Listener ausblenden.

Wenn Sie immer noch verwirrt über das Gerät sind, können Sie mein Repository auf GitHub überprüfen und mit dem Code spielen. Die Adresse lautet: Ссылка

Obwohl der Inhalt des Feeds ausschließlich auf Chinesisch verfasst ist, ist der Code in Englisch.

    
Anthonyeef 10.11.2015 05:14
quelle
1

Sie können es programmgesteuert tun, wenn Sie zum nächsten Tab wischen.

%Vor%

Setzen Sie die Sichtbarkeit auf View.VISIBLE , wenn Sie zurückwischen.

    
adao7000 16.07.2015 14:32
quelle
1

Erstellen Sie einen statischen booleschen Wert in Ihrer Aktivität (siehe YourActivity.isFABinCurrentTabVisible unten) und ändern Sie ihn in Ihrem ViewPager entsprechend, wenn es eine Fab in der aktuellen Registerkarte geben sollte oder nicht. Könnte ein dreckiger Fix sein, aber ... Und in Betracht ziehen, fab.show() und fab.hide() anstelle von setVisiblity() zu verwenden. Diese führen die Ein- und Ausblendanimationen durch.

%Vor%     
kphil 28.08.2015 21:11
quelle
1

Implementieren Sie ViewPager.onPageListener, und fahren Sie mit onPageSelected fort, und zeigen oder verbergen Sie FAB auf Tabs gemäß Ihren Anforderungen. Es folgt der Beispielcode:

%Vor%

Sie können auch fab.show (); und fab.hide ();

Überprüfen Sie auch dies für weitere Details.

    
Juni 16.09.2015 14:43
quelle
0

Es hört sich so an, als würdest du dich aus dem falschen Winkel nähern ...

  

So könnten Sie beispielsweise auf einer Registerkarte neue Elemente im FAB hinzufügen, aber auf der nächsten Registerkarte können Sie keine Elemente hinzufügen.

Setzen Sie den FAB in das Fragment der ersten Seite anstelle des Hosting Fragment / Activity . Auf diese Weise wird es automatisch mit dem ersten Seitenfragment verschwinden - es wird sogar neben ihm animieren. Es wird auch dort sein, wo es hingehört, da es überhaupt nicht mit den anderen Seiten / Tabs zusammenhängt.

Wenn Sie das click -Ereignis in Ihrem Hosting Fragment / Activity wirklich bearbeiten müssen, rufen Sie den ersten Seitenfragment-Aufruf zurück zum Hosting Fragment / Activity , wenn dieser Klick erfolgt.

    
Nicklas 17.07.2015 16:58
quelle

Tags und Links