6

Also ich bin mit https://github.com/neokree/MaterialNavigationDrawer für meine Navigationsleiste und https://gist.github.com/Jogan/9def6110edf3247825c9 als meine FAB-Implementierung. Wenn ich die Navigationsleiste öffne, wird der FAB nicht abgedeckt und die Schaltfläche erscheint darüber. Ich würde gerne vermeiden, den Knopf zu verstecken und ihn beim Öffnen/Schließen der Schublade zu zeigen, da dies eher störend ist. Irgendwelche Ideen, wie das zu beheben ist?Floating Action-Taste erscheint über Navigationsleiste

Edit: Ich füge die FAB programmatisch die folgenden Aktionen ausführen:

fabButton = new FloatingActionButton.Builder(this) 
      .withDrawable(getResources().getDrawable(R.drawable.ic_action_edit)) 
      .withButtonColor(0xFF2196F3) 
      .withGravity(Gravity.BOTTOM | Gravity.END) 
      .withMargins(0, 0, 16, 16) 
      .create(); 

diese Erklärung an das Fragment ändern es nicht beheben. Die Nav-Bar-Implementierung, die ich oben verlinkt habe, erfordert, dass sich die Aktivität von einer MaterialNavigationDrawer-Klasse erstreckt, die zuerst das Nav-Drawer zeichnet, wobei die Schaltfläche immer die letzte bleibt. Gibt es eine Möglichkeit, die Reihenfolge der Elemente programmgesteuert zu erzwingen?

Antwort

7

Wenn die Navigationsleiste geöffnet ist, wird FAB angezeigt, da diese FAB-Implementierung FAB zur Inhaltsansicht hinzufügt (android.R.id.content). Je nach Implementierung des Navigationsschubladens scheinen sie sich in der Ansichtshierarchie auf derselben Ebene zu befinden.

Wenn Sie nicht zu verschiedenen FAB-Implementierung wechseln möchten. Verwenden Sie onDrawerSlide(View drawerView, float offset) und ändern Sie FAB alpha, wenn Sie die Schublade öffnen. Sie können auch seine Sichtbarkeit in onDrawerClose() oder onDrawerOpen() Methoden auch wechseln.

Edit:

@Override 
public void onDrawerSlide(View drawerView, float offset){ 
    fabButton.setAlpha(offset); 
} 
+0

Ich habe versucht, die Sichtbarkeit zu ändern und es funktioniert, aber die Animation zieht die Aufmerksamkeit von der Schublade und in Richtung der Schaltfläche. Könnten Sie bitte Alpha erläutern, ich bin nicht sehr vertraut damit. –

+1

Nun, Sie haben zwei weitere Optionen: Ändern Sie die ursprüngliche Implementierung, um FAB zu Ihrem Fragmentlayout hinzuzufügen, oder verstecken Sie Fab, sobald der Nav-Drawer späht. Sehen Sie meine Bearbeitung in Ihrer Frage zum Ändern von Alpha. –

+0

Die Implementierung hilft bei der Animation. Ich würde am liebsten die Nav-Schublade den Button überlagern lassen. Das Problem, das ich habe, ist, dass die Implementierung des Nav-Drawers mich zwingt, keine onCreate-Methode zu verwenden, sodass ich keine Inhaltsansicht festlegen kann. Stattdessen startet es das Fragment, das am ersten Abschnitt in der Schublade fixiert ist, sodass das Layout des Fragments zu diesem Zeitpunkt nicht verfügbar ist. Gibt es eine Möglichkeit, die Reihenfolge in der Inhaltsansicht zu ändern? –

2

ich eine saubere Lösung gefunden haben, die nicht alpha darin oder Makeln auf die Schaltfläche beinhalten wird, wenn die Schublade geöffnet oder geschlossen (was es wie eine Verzögerung aussehen lässt). Programmgesteuert können Sie den Endbereich der Schaltfläche so ändern, dass er aus dem Fenster der Aktivität übergeht, während sich der Offset der Lade ändert.

Also zunächst einmal außerhalb der onDrawerSlide Methode, müssen Sie den Layout-Parameter mit dem folgenden Code des FAB erhalten (je nach Layout der in der Schaltfläche, in meinem Fall, es ist ein FrameLayout):

final FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fab.getLayoutParams(); 

Verstehen Sie, dass ich dies auf der Grundlage einer einfachen mathematischen linearen Gleichung mache: y = mx + n, während 'y' der Rand ist, 'm' ist die Steigung (Sie können es ändern), 'x' ist die slideOffset und ' n 'ist der Standardwert/Originalrand (16dp). Dies ist, wie Sie die Standard-Marge und die Neigung zu Variablen als Pixel zuweisen, während die Fülle der Anzeigedichten Achtung:

int density = (int) Resources.getSystem().getDisplayMetrics().density; 
final int defaultMargin = 16 * density; 
final int slope = -100 * density; 

Dann innen onDrawerSlide, gehen Sie wie folgt vor:

params.setMarginEnd((int) (slope * slideOffset + defaultMargin)); 
fab.setLayoutParams(params); 

Wenn diese doesn‘ t arbeiten für Sie, versuchen Sie, die marginEnd der Schaltfläche beim Erstellen zu setzen, oder legen Sie die Ränder der Layout-Parameter wie folgt (obwohl Sie überprüfen müssten, ob marginEnd ist rechts oder links):

params.setMargins(int left, int top, int right, int bottom); 

Ich hoffe, das hat geholfen. Dies ist meine erste Antwort, also hoffe ich, dass Sie nicht viele Beschwerden darüber haben werden.

1

Dies ist eine alternative Lösung, die für mich funktioniert. Angenommen, Sie möchten FAB in yourlayout.xml hinzufügen. nun eine framelayout in yourlayout.xml

<FrameLayout 
     android:id="@+id/myframelayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

nun in FloatingActionButton.java ersetzen die Methode

public FloatingActionButton create() { 
    ... 
    ViewGroup root = (ViewGroup) activity.findViewById(android.R.id.content); 
    root.addView(button, params); 
    return button; 
} 

mit

public FloatingActionButton create(FrameLayout framelayout) { 
    ... 
    framelayout.addView(button, params); 
    return button; 
} 

nun die FAB Erklärung wie folgt ändern erstellen.

FrameLayout yourframelayout = (FrameLayout)findViewById(R.id.myframelayout); 

fabButton = new FloatingActionButton.Builder(this) 
     .withDrawable(getResources().getDrawable(R.drawable.ic_action_edit)) 
     .withButtonColor(0xFF2196F3) 
     .withGravity(Gravity.BOTTOM | Gravity.END) 
     .withMargins(0, 0, 16, 16) 
     .create(yourframelayout); 

Das ist es !!

0

Ich bin Aktualisierung Nikola Despotoski Lösung:

So haben Sie die Fab deaktivieren/verstecken auch die Alpha nach der Einstellung so, wenn jeder Benutzer Zeit an Ort tippt wo fab nichts gezeigt wird dann passieren würde.

Verwandte Themen