Xamarin Android BottomBarBadge неправильно отображает счет 100+ - PullRequest
0 голосов
/ 04 июня 2018

Когда я пытаюсь отобразить число больше 99 в BottomBarBadge, оно не будет отображаться правильно, потому что на значке недостаточно места.

Этот снимок экрана показывает значок, который на самом деле содержит счет 110, но он выглядит как "11", потому что "0" обрезается маленьким значком:

enter image description here

Проблема в том, что при изменении количества я просто устанавливаю новый badge.Count следующим образом:

badge.Count = int.Parse(text);

В этот момент я ожидаю, что значок будет автоматически отображатьсяэто новая ширина, чтобы соответствовать новому количеству, если ему нужна новая высота (например, измененная с 99 на 100 или наоборот).Но, похоже, этого не происходит.

Есть ли метод или какая-то другая вещь, которую я пропускаю, которая обновляет ширину значка?

Я ожидаю, что значок будет немного растягиваться по ширине, если это необходимо, как в WhatsApp:

enter image description here

Я использую 3-йВечеринка BottomNavigationBar от pocheshire: https://github.com/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)

Я не смог найти ошибку в Custom Renderer, я установил точки останова в каждой строке кодакоторый вызывает MakeBadgeForTabAt(), но он не выполнил этот код до возникновения исключения.

Этот код вызывает исключение:

protected virtual void OnTabbedPagePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    var page = sender as Page;
    if (page == null)
        return;

    if (e.PropertyName == TabBadge.BadgeTextProperty.PropertyName)
    {
        if (CheckValidTabIndex(page, out int tabIndex))
        {
            var element = Element.Children[tabIndex];
            UpdateTabBadgeText(BadgeViews[element], page);
        }
        return;
    }
}

private void UpdateTabBadgeText(BottomBarBadge badge, Element element)
{
    var text = TabBadge.GetBadgeText(element);
    if (!String.IsNullOrEmpty(text))
    {
        try
        {
            // This does not cause an exception, but doesn't update the badge's size:
            // badge.Count = int.Parse(text);

            // This causes NullReferenceException when taping the tab:
            var index = Element.Children.IndexOf((Page)element);
            _bottomBar.RemoveBadgeAt(index);
            _bottomBar.MakeBadgeForTabAt(index, "#FF0000", int.Parse(text));
        }
        catch (Exception)
        {
            // exception handling
        }
    }
    if (badge.Count == 0)
    {
        badge.Hide(false);
    }
    else
    {
        badge.Show(false);
    }
}

1 Ответ

0 голосов
/ 04 июня 2018

Это перенесенная версия Java-версии, которая устарела, и эта проблема была в оригинале.

Обходной путь - удалить значок, когда значение превышает 99, и добавить его снова, вместо того, чтобы просто увеличить счет.

Я не смотрел на версию C #, но предположил, что кодBottomBarBadge.java - это то же самое, и размер вида значка рассчитывается только один раз при использовании метода attachToTab.Таким образом, обходной путь работает, так как поток attachToTab/adjustPositionAndSize вызывается снова, но содержимое значка действительно нужно проверить, чтобы определить, не переполнят ли они круг значков, и повторно вызвать adjustPositionAndSize, ... я думаю ...; -)

re: https://github.com/roughike/BottomBar/blob/master/bottom-bar/src/main/java/com/roughike/bottombar/BottomBarBadge.java#L94

Обновление:

Существует множество проблем / ошибок при удалении / воссоздании значка и т. Д. В этой библиотеке (которая являетсянемного отличается от оригинальной библиотеки 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 вида значков, как на изображении в вопросе (растяните его по ширине, но не увеличивайте высоту), вместо этого вы можете использовать этот код в методе 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...