86
С API 28 вы можете просто добавить текст в Fab, используя:
Посетите: https://material.io/develop/android/components/extended-floating-action-button/
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:contentDescription="@string/extended_fab_content_desc"
android:text="@string/extended_fab_label"
app:icon="@drawable/ic_plus_24px"
app:layout_anchor="@id/app_bar"
app:layout_anchorGravity="bottom|right|end"/>
implementation 'com.google.android.material:material:1.1.0-alpha06'
Спасибо всем.
Вот простой способ решения этого вопроса. Правильно работает для Android 4+, для Android 5+ добавлен специальный параметр android: elevation для рисования TextView поверх FloatingActionButton.
<FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right"> <android.support.design.widget.FloatingActionButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:color/transparent" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="@android:string/ok" android:elevation="16dp" android:textColor="@android:color/white" android:textAppearance="?android:attr/textAppearanceMedium" /> </FrameLayout>
источник
android:layout_margin="20dp"
в FloatingActionButton, чтобы решить проблемы с тенями. В ожидании лучшего решения для этогоandroid:includeFontPadding="false"
вTextView
тег для повышения производительностипреобразовать текст в растровое изображение и использовать его. это очень просто.
fab.setImageBitmap(textAsBitmap("OK", 40, Color.WHITE)); //method to convert your text to image public static Bitmap textAsBitmap(String text, float textSize, int textColor) { Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setTextSize(textSize); paint.setColor(textColor); paint.setTextAlign(Paint.Align.LEFT); float baseline = -paint.ascent(); // ascent() is negative int width = (int) (paint.measureText(text) + 0.0f); // round int height = (int) (baseline + paint.descent() + 0.0f); Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(image); canvas.drawText(text, 0, baseline, paint); return image; }
источник
FAB обычно используются в
CoordinatorLayout
s. Вы можете использовать это:<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" app:backgroundTint="@color/colorPrimary" /> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="OK" android:elevation="6dp" android:textSize="18dp" android:textColor="#fff" app:layout_anchor="@id/fab" app:layout_anchorGravity="center"/> </android.support.design.widget.CoordinatorLayout>
Это то, что работает
app:layout_anchor="@id/fab" app:layout_anchorGravity="center"
Результат:
Если вы используете что-то
layout_behavior
для своего FAB, вам придется сделать аналогичныйlayout_behavior
дляTextView
источник
android.support.design.widget.FloatingActionButton cannot be cast to android.view.ViewGroup
, вероятно, связана с тем , что вы поместилиTextView
внутрь FAB. Пожалуйста, свяжитесь с OP, где закрывается тег.Вы не можете установить текст для
FloatingActionButton
из библиотеки поддержки, но вы можете создать текстовое изображение прямо из студии Android:,File -> New -> Image Asset
а затем использовать его для своей кнопки.С точки зрения материального дизайна ; они не упомянули использование текста с
FloatingActionButton
, и я не вижу причин для этого, поскольку у вас действительно мало места для текста.источник
Мне нужен текст в FAB, но вместо этого я просто выбрал TextView с круговым рисованным фоном:
<TextView android:layout_margin="10dp" android:layout_gravity="right" android:gravity="center" android:background="@drawable/circle_background" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#FFF" android:textStyle="bold" android:fontFamily="sans-serif" android:text="AuthId" android:textSize="15dp" android:elevation="10dp"/>
Вот вариант (circle_backgroung.xml):
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#666666"/> <size android:width="60dp" android:height="60dp"/> </shape>
источник
Ответ @NandanKumarSingh https://stackoverflow.com/a/39965170/5279156 работает, но я внес некоторые изменения с помощью fab в код (не xml, потому что они будут перезаписаны в методах класса)
fab.setTextBitmap("ANDROID", 100f, Color.WHITE) fab.scaleType = ImageView.ScaleType.CENTER fab.adjustViewBounds = false
Где
setTextBitmap
расширение дляImageView
класса с аналогичной функциональностью, но поддерживает многострочный текстfun ImageView.setTextBitmap(text: String, textSize: Float, textColor: Int) { val paint = Paint(Paint.ANTI_ALIAS_FLAG) paint.textSize = textSize paint.color = textColor paint.textAlign = Paint.Align.LEFT val lines = text.split("\n") var maxWidth = 0 for (line in lines) { val width = paint.measureText(line).toInt() if (width > maxWidth) { maxWidth = width } } val height = paint.descent() - paint.ascent() val bitmap = Bitmap.createBitmap(maxWidth, height.toInt() * lines.size, Bitmap.Config.ARGB_8888) val canvas = Canvas(bitmap) var y = - paint.ascent() for (line in lines) { canvas.drawText(line, 0f, y, paint) y += height } setImageBitmap(bitmap) }
источник
Я использовал CardView для достижения того же результата
<androidx.cardview.widget.CardView android:layout_width="@dimen/dp80" android:layout_height="@dimen/dp80" android:layout_gravity="center_horizontal" app:cardElevation="@dimen/dp8" android:layout_marginBottom="@dimen/dp16" android:layout_marginTop="@dimen/dp8" app:cardBackgroundColor="@color/colorWhite100" app:cardCornerRadius="@dimen/dp40"> <TextView style="@style/TextAppearance.MaterialComponents.Headline4" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_horizontal" android:background="@drawable/shape_go_bg" android:text="GO" android:gravity="center" android:textColor="@color/colorWhite100" /> </androidx.cardview.widget.CardView>
источник
Очень небольшая модификация ответа товарища , чтобы поддержать его для Android API ниже 21, просто добавьте
app:elevation="0dp"
вFloatingActionButton
Это может помочь другим!
источник