Więc w swoim build.gradle
pliku dodaj to:
compile 'com.android.support:design:27.1.1'
Uwaga AndroidX: Google wprowadza nowe biblioteki rozszerzeń AndroidX, aby zastąpić starsze biblioteki obsługi. Aby korzystać z AndroidX, najpierw upewnij się , że zaktualizowałeś gradle.properties
plik , wyedytowałeś build.gradle
go compileSdkVersion
na 28
(lub wyższy) i użyj następującego wiersza zamiast poprzedniego compile
.
implementation 'com.google.android.material:material:1.0.0'
Następnie, w swoim themes.xml
lub styles.xml
czymkolwiek innym , upewnij się, że ustawiłeś to - jest to kolor akcentu twojej aplikacji - i kolor twojego FAB, chyba że go zastąpisz (patrz poniżej):
<item name="colorAccent">@color/floating_action_button_color</item>
W kodzie XML układu:
<RelativeLayout
...
xmlns:app="http://schemas.android.com/apk/res-auto">
<android.support.design.widget.FloatingActionButton
android:id="@+id/myFAB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_plus_sign"
app:elevation="4dp"
... />
</RelativeLayout>
Lub jeśli korzystasz z biblioteki materiałów AndroidX powyżej, zamiast tego użyj tego:
<RelativeLayout
...
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/myFAB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:srcCompat="@drawable/ic_plus_sign"
app:elevation="4dp"
... />
</RelativeLayout>
Możesz zobaczyć więcej opcji w dokumentach ( dokumenty materialne tutaj) ( setRippleColor
itp.), Ale jedną z ważnych informacji jest:
app:fabSize="mini"
Kolejny interesujący - aby zmienić kolor tła tylko jednego FAB, dodaj:
app:backgroundTint="#FF0000"
(na przykład, aby zmienić kolor na czerwony) do pliku XML powyżej.
W każdym razie w kodzie po zawyżeniu widoku Aktywności / fragmentu ....
FloatingActionButton myFab = (FloatingActionButton) myView.findViewById(R.id.myFAB);
myFab.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
doMyThing();
}
});
Obserwacje:
- Jeśli masz jeden z tych przycisków, który znajduje się na „szwie” dzielącym dwa widoki (na przykład przy użyciu układu RelativeLayout) z, powiedzmy, ujemnym dolnym marginesem układu nakładającym się na obramowanie, zauważysz problem: rozmiar FAB jest w rzeczywistości bardzo różni się na Lollipop i Pre-Lollipop. W rzeczywistości możesz to zobaczyć w edytorze układu graficznego AS, gdy przełączasz się między interfejsami API - nagle "wydycha", gdy przełączasz się na pre-lollipop. Wydaje się, że przyczyną dodatkowego rozmiaru jest to, że cień rozszerza rozmiar widoku w każdym kierunku. Musisz więc to uwzględnić, dostosowując marginesy FAB, jeśli jest blisko innych rzeczy.
Oto sposób na usunięcie lub zmianę wypełnienia, jeśli jest za dużo:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams) myFab.getLayoutParams();
p.setMargins(0, 0, 0, 0); // get rid of margins since shadow area is now the margin
myFab.setLayoutParams(p);
}
Zamierzałem również programowo umieścić FAB na „szwie” między dwoma obszarami w układzie względnym, chwytając wysokość FAB, dzieląc ją przez dwa i używając tego jako przesunięcia marginesu. Ale myFab.getHeight () zwróciło zero, wydawało się, że nawet po zawyżeniu widoku. Zamiast tego użyłem ViewTreeObserver, aby uzyskać wysokość dopiero po jej rozłożeniu, a następnie ustawieniu pozycji. Zobacz tę wskazówkę
tutaj . Wyglądało to tak:
ViewTreeObserver viewTreeObserver = closeButton.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
closeButton.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
closeButton.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) closeButton.getLayoutParams();
params.setMargins(0, 0, 16, -closeButton.getHeight() / 2);
closeButton.setLayoutParams(params);
}
});
}
Nie jestem pewien, czy to właściwy sposób, ale wydaje się, że działa.
- Wygląda na to, że możesz zmniejszyć przestrzeń cienia przycisku, zmniejszając wysokość.
Jeśli chcesz FAB na „szwie”, możesz użyć layout_anchor
i layout_anchorGravity
oto przykład:
<android.support.design.widget.FloatingActionButton
android:layout_height="wrap_content"
android:layout_width="wrap_content"
app:layout_anchor="@id/appbar"
app:layout_anchorGravity="bottom|right|end"
android:src="@drawable/ic_discuss"
android:layout_margin="@dimen/fab_margin"
android:clickable="true"/>
Pamiętaj, że możesz automatycznie sprawić, by przycisk wyskoczył z drogi, gdy pojawi się Snackbar , owijając go w CoordinatorLayout .
Jeszcze: