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;
}