qstumn/BadgeView

badge not hiding on 0 entered.

armata99 opened this issue · 5 comments

neither the hide method nor the 0 input can hide the badge...

me ,two

me,too

neither the hide method nor the 0 input can hide the badge...

该问题是因为重复创建了BadgeView。应该让BadgeView只创建一次。

The problem is
if (mBadgeNumber < 0) {
mBadgeText = "";
in QBadgeView.java

@OverRide
public Badge setBadgeNumber(int badgeNumber) {
mBadgeNumber = badgeNumber;
if (mBadgeNumber < 0) {
mBadgeText = "";
} else if (mBadgeNumber > mMaxBadgeNumber) {
mBadgeText = mExact ? String.valueOf(mBadgeNumber) : mMaxBadgeNumber + "+";
} else if (mBadgeNumber > 0) {
mBadgeText = String.valueOf(mBadgeNumber);
} else {
mBadgeText = null;
}
measureText();
invalidate();
return this;
}

Try editing it in your source since apparently the developer ditched the project 2 years ago

I stumbled upon this issue but found a (rather hacky) way to solve this without having to modifying the library yourself

If you use Kotlin in your project, you can use this extension function snippet

// Extensions
fun QBadgeView.setup(count: Int, targetView: View) {
    this
            .setBadgeNumber(count)
            .setBadgeGravity(Gravity.TOP or Gravity.END)
            // add other setter / options according to your own need
            .bindTarget(targetView)
    if (count == 0) {
        val parent = this.targetView.parent
        if (parent is ViewGroup) {
            parent.children.forEach { child ->
                if (child is QBadgeView) { child.isVisible = false }
            }
        }
    }
}

// Usage
private fun setupView() {
    // val count = someMethodToGetCount()
    // val targetView = the view from findViewById / viewBinding / kotlin_synthetic
    QBadgeView(context).setup(count, targetView)
}

Basically, we just simply set the BadgeView's visibility to GONE when our number / count is 0

val parent = this.targetView.parent // "this" is the BadgeView object
        if (parent is ViewGroup) {
            // Iterate the children to search for BadgeView object
            parent.children.forEach { child ->
                if (child is QBadgeView) { 
                    child.isVisible = false  // If it's a BadgeView, we set visibility to gone, 
                                             // isVisible is just a nicer way to do it from core-ktx library
                                             // otherwise just use setVisibility( ... )
                }
            }
        }

Hope this helpful