Xamarin Android Bottombadge不';t正确显示100+的计数;

Xamarin Android Bottombadge不';t正确显示100+的计数;,android,xamarin,xamarin.forms,xamarin.android,Android,Xamarin,Xamarin.forms,Xamarin.android,当我试图在bottomBarEdge中显示大于99的计数时,它将无法正确显示,因为徽章中没有足够的空间 此屏幕截图显示了一个徽章,其中实际包含110个计数,但它看起来像“11”,因为“0”被小徽章截断: 问题是,当计数发生变化时,我只是将新的徽章设置为count,如下所示: badge.Count = int.Parse(text); 此时,如果徽章需要新的高度(例如,从99变为100或相反),我希望徽章会自动呈现新的宽度以适应新的计数。但这似乎没有发生 是否有一种方法或其他我缺少的东西来更

当我试图在
bottomBarEdge
中显示大于99的计数时,它将无法正确显示,因为徽章中没有足够的空间

此屏幕截图显示了一个徽章,其中实际包含110个计数,但它看起来像“11”,因为“0”被小徽章截断:

问题是,当计数发生变化时,我只是将新的
徽章设置为count
,如下所示:

badge.Count = int.Parse(text);
此时,如果徽章需要新的高度(例如,从99变为100或相反),我希望徽章会自动呈现新的宽度以适应新的计数。但这似乎没有发生

是否有一种方法或其他我缺少的东西来更新徽章的宽度

如果需要的话,我希望徽章在宽度上会有一点伸展,就像WhatsApp中的那样:

我正在使用pocheshire的第三方BottomNavigationBar:


编辑: 使用确实有效,但它破坏了其他东西。当我点击包含徽章的选项卡时,应用程序将在
NullReferenceException
中崩溃:

System.NullReferenceException: Object reference not set to an instance of an object.
  at BottomNavigationBar.BottomBar.HandleClick (Android.Views.View v) [0x00010] in <f60603cf39c84bebb4c6ba69e7e8bb64>:0 
  at BottomNavigationBar.BottomBar+<MakeBadgeForTabAt>c__AnonStorey1.<>m__0 () [0x00011] in <f60603cf39c84bebb4c6ba69e7e8bb64>:0 
  at BottomNavigationBar.Listeners.OnTabClickListener.OnClick (Android.Views.View v) [0x0000d] in <f60603cf39c84bebb4c6ba69e7e8bb64>:0 
  at Android.Views.View+IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_v) [0x0000f] in <263adecfa58f4c449f1ff56156d886fd>:0 
  at (wrapper dynamic-method) System.Object.30ced559-6971-4697-bb8d-82a961a4b1e9(intptr,intptr,intptr)

这是一个不推荐使用的Java版本的移植版本,该问题是在原始版本中出现的

解决方法是在值超过99时移除徽章,然后再次添加,而不是仅仅增加计数

我没有看过C#版本,但是假设
bottomBarEdge.java
的代码是“相同”的,并且在
attachToTab
方法中只计算一次徽章视图的大小。因此,由于再次调用了
attachToTab/adjustPositionAndSize
流,因此解决方法是有效的,但是应该真正检查徽章内容,以确定它们是否会溢出徽章循环,并重新调用
adjustPositionAndSize
,…我认为…;-)

关于:

更新: 在移除/重新创建徽章等方面存在大量问题/bug。。在该库中(与原始Java库略有不同)

虽然这应该在库中,但在设置计数时,您可以这样做以正确调整徽章的大小:

void ResetBadgeCount(BottomBarBadge badge, int count)
{
    badge.Count = count;
    ViewGroup.LayoutParams lparams;
    using (var bounds = new Rect())
    {
        badge.Paint.GetTextBounds(badge.Text, 0, badge.Text.Length, bounds);
        lparams = _badge2.LayoutParameters;
        badge.SetSingleLine();
        lparams.Width = (int)((bounds.Right - bounds.Left) * 1.25);
    }
    lparams.Height = lparams.Width;
    badge.LayoutParameters = lparams;
}
并在每次设置徽章数量时调用:

ResetBadgeCount(_yourBadgeInstance, 999);
或者将其作为扩展方法:

public static class MyExtensions
{
    public static void ResetBadgeCount(this BottomBarBadge badge, int count)
    {
        badge.Count = count;
        ViewGroup.LayoutParams lparams;
        using (Rect bounds = new Rect())
        {
            badge.Paint.GetTextBounds(badge.Text, 0, badge.Text.Length, bounds);
            badge.SetSingleLine();
            lparams = badge.LayoutParameters;
            lparams.Width = (int)((bounds.Right - bounds.Left) * 1.25);
        }
        lparams.Height = lparams.Width;
        badge.LayoutParameters = lparams;
    }
}
然后,您可以通过以下方式进行呼叫:

_yourBadgeInstance.ResetBadgeCount(999);
_yourBadgeInstance.ResetBadgeCount(1999);

要实现更“WhatsApp-like”的外观,查找问题中图像中的徽章(拉伸宽度但不增加高度),您可以在
ResetBadgeCount
方法中使用此代码:

private void ResetBadgeCount(BottomBarBadge badge, int count)
{
    badge.Count = count;
    ViewGroup.LayoutParams lparams;
    using (var bounds = new Rect())
    {
        badge.Paint.GetTextBounds(badge.Text, 0, badge.Text.Length, bounds);
        lparams = badge.LayoutParameters;
        badge.SetSingleLine();
        lparams.Width = (int)Math.Round(badge.Paint.MeasureText(badge.Text) * 1.25);
        var metrics = badge.Paint.GetFontMetrics();
        lparams.Height = (int)Math.Round((metrics.Bottom - metrics.Top) * 1.25);
    }
    if (lparams.Width < lparams.Height)
    {
        lparams.Width = lparams.Height;
    }
    badge.LayoutParameters = lparams;
}
private void ResetBadgeCount(底部边界标记,整数计数)
{
徽章.计数=计数;
ViewGroup.LayoutParams lparams;
使用(var bounds=new Rect())
{
badge.Paint.GetTextBounds(badge.Text,0,badge.Text.Length,bounds);
lparams=badge.LayoutParameters;
badge.SetSingleLine();
lparams.Width=(int)Math.Round(badge.Paint.MeasureText(badge.Text)*1.25);
var metrics=badge.Paint.GetFontMetrics();
lparams.Height=(int)Math.Round((metrics.Bottom-metrics.Top)*1.25);
}
if(lparams.Width
您使用的是第三方
底部工具栏吗?
?是的,编辑了我的问题,该问题是Java版本的移植版本,已弃用,该问题是原始版本。一个解决方法是当值超过99时移除徽章,然后再次添加它,而不是仅仅增加countAh,感谢您的解释!你的变通方法有效。请随意添加您的评论作为答案,以便我可以接受。感谢您经常在Xamarin问题中闲逛,我从您的多次回答中学到了很多:)编辑我的问题是因为该解决方案会导致
NullReferenceException
不幸的是,当我点击包含徽章的选项卡时,该解决方案会导致
NullReferenceException
。请看我的编辑question@DennisSchr看到我更新的答案,应该可以解决您的问题。@DennisSchrör没问题,很高兴它有帮助
private void ResetBadgeCount(BottomBarBadge badge, int count)
{
    badge.Count = count;
    ViewGroup.LayoutParams lparams;
    using (var bounds = new Rect())
    {
        badge.Paint.GetTextBounds(badge.Text, 0, badge.Text.Length, bounds);
        lparams = badge.LayoutParameters;
        badge.SetSingleLine();
        lparams.Width = (int)Math.Round(badge.Paint.MeasureText(badge.Text) * 1.25);
        var metrics = badge.Paint.GetFontMetrics();
        lparams.Height = (int)Math.Round((metrics.Bottom - metrics.Top) * 1.25);
    }
    if (lparams.Width < lparams.Height)
    {
        lparams.Width = lparams.Height;
    }
    badge.LayoutParameters = lparams;
}