Używam nowego FloatingActionButton z Google Design Library i pojawiają się dziwne problemy z dopełnieniem / marginesami. Ten obraz (z włączonymi opcjami układu programisty) pochodzi z interfejsu API 22.
I z API 17.
To jest plik 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"/>
Dlaczego FAB w API 17 jest o wiele większy pod względem dopełnienia / marginesów?
CoordinatorLayout
do wyrównania go w pionie i gałki ocznej dodatkowej wyściółki pre-lollipop. Możesz to rozgryźć na podstawie zdekompilowanych źródeł FAB, ale wolałbym poczekać, aż Google naprawi to tak, jak zrobiliCardView
.Odpowiedzi:
Aktualizacja (październik 2016 r.):
Prawidłowym rozwiązaniem jest teraz umieszczenie
app:useCompatPadding="true"
w FloatingActionButton. Dzięki temu wypełnienie będzie spójne między różnymi wersjami interfejsu API. Jednak nadal wydaje się, że powoduje to nieznaczne zmniejszenie domyślnych marginesów, więc może być konieczne ich dostosowanie. Ale przynajmniej nie ma już potrzeby stosowania stylów specyficznych dla API.Poprzednia odpowiedź:
Możesz to łatwo osiągnąć za pomocą stylów specyficznych dla API. W swoim normalnym miejscu
values/styles.xml
umieść coś takiego:a następnie w values-v21 / styles.xml, użyj tego:
i zastosuj styl do FloatingActionButton:
Jak zauważyli inni, w API <20 przycisk renderuje swój własny cień, który dodaje do ogólnej logicznej szerokości widoku, podczas gdy w API> = 20 używa nowych parametrów Elevation, które nie mają wpływu na szerokość widoku.
źródło
elevation
ustawień ustawionych na FAB.app:useCompatPadding="true"
Koniec z majstrowaniem
styles.xml
przy.java
plikach. Pozwól mi to uprościć.Dodatkowy margines / wypełnienie, które widziałeś na FAB na swoim drugim obrazie, jest spowodowany tym kompatybilnym wypełnieniem na urządzeniach przed Lollipopem . Jeśli ta właściwość nie jest ustawiona, jest stosowana na urządzeniach sprzed lollopop , a NIE na urządzeniach Lollipop +.
Dowód koncepcji
źródło
po kilku chwilach szukania i testowania rozwiązania naprawiam swój problem, dodając tę linię tylko do mojego układu xml:
a to jest mój cały układ przycisków pływających
źródło
useCompatPadding
nic innego nie daje takiego samego wyniku.Wystąpił problem w bibliotece Design Support Library. Użyj poniższej metody, aby rozwiązać ten problem, dopóki biblioteka nie zostanie zaktualizowana. Spróbuj dodać ten kod do swojego działania lub fragmentu, aby rozwiązać problem. Zachowaj ten sam plik XML. Na Lollipop i powyżej nie ma marginesu, ale poniżej jest margines 16 dp.
Zaktualizuj przykład roboczy
XML - FAB znajduje się w RelativeLayout
Jawa
Konwertuj dp na px
Lizak
Pre Lollipop
źródło
RelativeLayout.LayoutParams
nie można rzutować naLayoutParams
zFloatingActionButton
i nie widzę żadnych marginesów 16 dp w wersji wcześniejszej niż Lollipop. SzerokośćFloatingActionButton
wcześniejszego Lollipopa to 84 dp zamiast 56 dp, a jego wysokość to 98 dp.View.getLayoutParams
zwraca aLayoutParams
typuView
jest w - w przypadku Eugene'a jest toRelativeLayout.LayoutParams
.W wersji pre Lollipop
FloatingActionButton
jest odpowiedzialny za rysowanie własnego cienia. Dlatego widok musi być nieco większy, aby zrobić miejsce na cień. Aby uzyskać spójne zachowanie, możesz ustawić marginesy uwzględniające różnicę w wysokości i szerokości. Obecnie używam następującej klasy :Aktualizacja: Zmieniono nazwę bibliotek obsługi Androida v23 fab_size na:
źródło
Odpowiedź Markusa zadziałała dobrze po aktualizacji do wersji 23.1.0 i wprowadzeniu pewnych poprawek do importu (z najnowszą wtyczką gradle używamy naszej aplikacji R zamiast R z biblioteki projektów). Oto kod wersji 23.1.0:
źródło
W pliku układu ustaw rzędną atrybutu na 0., ponieważ przyjmuje ona domyślną rzędną.
Teraz w aktywności sprawdź poziom api większy niż 21 i ustaw wysokość, jeśli to konieczne.
źródło