0

Hey I want to show badge drawable. I tried code from here Does BadgeDrawable not work for views within a FrameLayout such as buttons, images, textviews etc.?, BadgeDrawable does not appear on elements other than BottomNavigationView, Badge Drawable not showing. I successfully show but problem is cutting from side edge.

<FrameLayout
    android:id="@+id/container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginEnd="24dp"
    android:clipChildren="false"
    android:clipToPadding="false"
    android:paddingStart="6dp"
    android:paddingTop="4dp"
    android:paddingEnd="9dp"
    android:paddingBottom="4dp"
    app:layout_constraintBottom_toBottomOf="@+id/xyz"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="@+id/xyz">

         <ImageView
             android:id="@+id/icon"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="start"
             android:src="@drawable/ic_settings"
             tools:ignore="ContentDescription" />

</FrameLayout>

activity.kt

fun addBadgeDrawable(count: Int, target: View, parent: FrameLayout, context: Context) {
        target.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
            override fun onGlobalLayout() {
                val badgeDrawable = BadgeDrawable.create(context)
                badgeDrawable.number = count
                badgeDrawable.badgeGravity = BadgeDrawable.TOP_END
                badgeDrawable.setBoundsFor(target, parent)
                parent.foreground = badgeDrawable
                target.viewTreeObserver.removeOnGlobalLayoutListener(this)
            }
        })
    }

    private fun BadgeDrawable.setBoundsFor(@NonNull anchor: View, @NonNull parent: FrameLayout) {
        val rect = Rect()
        parent.getDrawingRect(rect)
        this.bounds = rect
        this.updateBadgeCoordinates(anchor, parent)
    }

I am setting badge view this code line

addBadgeDrawable(10, binding.icon, binding.container, context)

Output

enter image description here

Expected Output

enter image description here

Kotlin Learner
  • 3,995
  • 6
  • 47
  • 127

1 Answers1

0

To avoid cutting, you need to increase paddingTop and paddingEnd in FrameLayout. Or may be need to add additional ConstraintLayout as a parent for FrameLayout, and play with constraints and paddings.

Hope this will help to someone.