Ich verwende den neuen FloatingActionButton aus der Google Design Library und habe einige seltsame Probleme mit dem Auffüllen / Rand. Dieses Bild (mit aktivierten Entwicklerlayoutoptionen) stammt von API 22.
Und von API 17.
Dies ist das XML
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_gravity="bottom|right"
android:layout_marginLeft="16dp"
android:layout_marginRight="20dp"
android:layout_marginTop="-32dp"
android:src="@drawable/ic_action_add"
app:fabSize="normal"
app:elevation="4dp"
app:borderWidth="0dp"
android:layout_below="@+id/header"/>
Warum ist das FAB in API 17 in Bezug auf Polsterung / Rand so viel größer?
CoordinatorLayout
, es vertikal auszurichten und den zusätzlichen Polster vor dem Lutscher zu betrachten. Sie könnten es aus den dekompilierten FAB-Quellen herausfinden, aber ich würde lieber warten, bis Google es so repariert, wie sie es getan habenCardView
.Antworten:
Update (Oktober 2016):
Die richtige Lösung besteht nun darin, sie
app:useCompatPadding="true"
in Ihren FloatingActionButton einzufügen. Dadurch wird das Auffüllen zwischen verschiedenen API-Versionen konsistent. Dies scheint jedoch die Standardränder immer noch ein wenig zu verringern, sodass Sie diese möglicherweise anpassen müssen. Zumindest sind API-spezifische Stile nicht mehr erforderlich.Vorherige Antwort:
Sie können dies einfach mit API-spezifischen Stilen erreichen. Geben Sie in Ihrem normalen
values/styles.xml
Zustand Folgendes ein:Verwenden Sie dann unter values-v21 / styles.xml Folgendes:
und wenden Sie den Stil auf Ihren FloatingActionButton an:
Wie andere angemerkt haben, rendert die Schaltfläche in API <20 einen eigenen Schatten, der zur logischen Gesamtbreite der Ansicht beiträgt, während in API> = 20 die neuen Höhenparameter verwendet werden, die nicht zur Ansichtsbreite beitragen.
quelle
elevation
Sie auf dem FAB eingestellt haben.app:useCompatPadding="true"
Kein Fummeln mehr mit
styles.xml
oder mit.java
Dateien. Lassen Sie es mich einfach machen.Der zusätzliche Rand / die zusätzliche Polsterung, die Sie in Ihrem zweiten Bild auf dem FAB gesehen haben, ist auf diese kompatible Polsterung auf Pre-Lollipop- Geräten zurückzuführen. Wenn diese Eigenschaft nicht festgelegt ist, wird sie auf Pre-Lollopop- Geräte und NICHT auf Lollipop + -Geräte angewendet .
Konzeptioneller Beweiß
quelle
Nach ein paar Zeit Suche und Testlösung behebe ich mein Problem mit dem Hinzufügen dieser Zeile nur zu meinem XML-Layout:
und das ist mein ganzes Float-Button-Layout
quelle
useCompatPadding
noch irgendetwas anderes erzielt das gleiche Ergebnis.Es gibt ein Problem in der Design Support Library. Verwenden Sie die folgende Methode, um dieses Problem zu beheben, bis die Bibliothek aktualisiert wird. Versuchen Sie, diesen Code zu Ihrer Aktivität oder Ihrem Fragment hinzuzufügen, um das Problem zu beheben. Behalte deine XML gleich. Auf Lutschern und darüber gibt es keinen Rand, aber darunter gibt es einen Rand von 16dp.
Arbeitsbeispiel aktualisieren
XML - FAB befindet sich in einem RelativeLayout
Java
Konvertiere dp in px
Lutscher
Pre Lollipop
quelle
RelativeLayout.LayoutParams
kann nicht auf dasLayoutParams
von geworfen werdenFloatingActionButton
und ich sehe keine Ränder von 16dp auf vor Lollipop. Die Breite vonFloatingActionButton
Pre Lollipop beträgt 84 dp anstelle von 56 dp und die Höhe 98 dp.View.getLayoutParams
gibt einLayoutParams
vom Typ desView
is in zurück - in Eugenes Fall ist es einRelativeLayout.LayoutParams
.Vor Lollipop
FloatingActionButton
ist er dafür verantwortlich, seinen eigenen Schatten zu zeichnen. Daher muss die Ansicht etwas größer sein, um Platz für den Schatten zu schaffen. Um ein konsistentes Verhalten zu erzielen, können Sie Ränder festlegen, um den Unterschied in Höhe und Breite zu berücksichtigen. Ich benutze derzeit die folgende Klasse :Update: Android Support Libraries v23 umbenannt in fab_size dimension in:
quelle
Markus 'Antwort funktionierte gut für mich, nachdem ich auf Version 23.1.0 aktualisiert und einige Anpassungen an den Importen vorgenommen hatte (mit dem aktuellen Gradle-Plugin verwenden wir unsere App R anstelle des R der Designbibliothek). Hier ist der Code für v23.1.0:
quelle
Setzen Sie in der Layoutdatei die Attributhöhe auf 0, da die Standardhöhe verwendet wird.
Überprüfen Sie jetzt in der Aktivität die API-Stufe größer als 21 und stellen Sie bei Bedarf die Höhe ein.
quelle