Итак, в свой build.gradle
файл добавьте это:
compile 'com.android.support:design:27.1.1'
Примечание для AndroidX: Google представляет новые библиотеки расширений AndroidX, которые заменят старые библиотеки поддержки. Чтобы использовать AndroidX, сначала убедитесь, что вы обновили свой gradle.properties
файл , отредактировали, build.gradle
чтобы установить compileSdkVersion
значение 28
(или выше), и используйте следующую строку вместо предыдущей compile
.
implementation 'com.google.android.material:material:1.0.0'
Далее, в вашем themes.xml
или styles.xml
или любой другой , убедитесь , что вы установили this- это вашего приложения акцент color-- и цвет вашего FAB , если не переопределить его (смотрите ниже):
<item name="colorAccent">@color/floating_action_button_color</item>
В XML макета:
<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>
Или, если вы используете библиотеку материалов AndroidX, указанную выше, вы бы вместо этого использовали это:
<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>
Вы можете увидеть больше опций в документации (материалы здесь) ( setRippleColor
и т. Д.), Но следует отметить следующее:
app:fabSize="mini"
Еще один интересный вариант - чтобы изменить цвет фона только одного FAB, добавьте:
app:backgroundTint="#FF0000"
(например, чтобы изменить его на красный) в XML выше.
Во всяком случае, в коде, после того, как представление Activity / Fragment раздувается ....
FloatingActionButton myFab = (FloatingActionButton) myView.findViewById(R.id.myFAB);
myFab.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
doMyThing();
}
});
Замечания:
- Если у вас есть одна из этих кнопок, которая находится на «стыке», разделяющем два представления (например, с использованием RelativeLayout), например, с отрицательным нижним полем макета для перекрытия границы, вы заметите проблему: размер FAB на самом деле сильно отличается на леденце от леденца на палочке. Вы действительно можете увидеть это в редакторе визуального макета AS, когда переключаетесь между API-интерфейсами - он внезапно «выпадает», когда вы переключаетесь на pre-lollipop. Причина дополнительного размера, по-видимому, в том, что тень увеличивает размер обзора во всех направлениях. Так что вы должны учитывать это, когда настраиваете поля FAB, если они близки к другим параметрам.
Вот способ удалить или изменить отступ, если его слишком много:
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);
}
Кроме того, я собирался программно разместить FAB на «стыке» между двумя областями в RelativeLayout, взяв высоту FAB, разделив на два и используя это как смещение поля. Но myFab.getHeight () вернул ноль, казалось, даже после того, как представление было раздутым. Вместо этого я использовал ViewTreeObserver, чтобы получить высоту только после того, как она выложена, а затем установила позицию. См. Этот совет
здесь . Выглядело это так:
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);
}
// not sure the above is equivalent, but that's beside the point for this example...
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) closeButton.getLayoutParams();
params.setMargins(0, 0, 16, -closeButton.getHeight() / 2); // (int left, int top, int right, int bottom)
closeButton.setLayoutParams(params);
}
});
}
Не уверен, что это правильный способ, но, похоже, он работает.
- Кажется, вы можете уменьшить теневое пространство кнопки, уменьшив высоту.
Если вы хотите, чтобы FAB находился на «шве», вы можете использовать его, layout_anchor
и layout_anchorGravity
вот пример:
<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"/>
Помните, что вы можете автоматически отскакивать от кнопки, когда появляется Snackbar , обернув ее в CoordinatorLayout .
Больше: