Использование FindViewById <> возвращает null при попытке получить BottomNavigationView - PullRequest
0 голосов
/ 11 июля 2020

У меня есть настраиваемое средство визуализации для моего GradientTabbedPage, и я пытаюсь установить градиентный фон для BottomNavigationView, но каждый идентификатор ресурса, который я пытаюсь использовать, возвращает значение null. Я пробовал следующие Resource.Ids:

bottomtab_tabbar
bottomtab_navarea
bottom
main_tablayout

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

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Это может вам помочь

protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
    {
        base.OnElementChanged(e);

        var control = (GradientTabbedPage)Element;

        var gradientDrawable = new GradientDrawable(GradientDrawable.Orientation.LeftRight,
            new int[] { control.TopColor.ToAndroid(), control.BottomColor.ToAndroid() });

        var relativeLayout = this.GetChildAt(0) as Android.Widget.RelativeLayout;
        var bottomNavigationView = relativeLayout.GetChildAt(1) as BottomNavigationView;
        bottomNavigationView.SetBackground(gradientDrawable);
        bottomNavigationView.Elevation = 0;
    }
0 голосов
/ 12 июля 2020
• 1000 1003 *

Я полагаю, вы используете этот класс GradientTabbedPageRenderer где-то в какой-то деятельности (я называю его здесь YourHolderActivity). Чтобы добраться до его элементов, вам необходимо указать его контекст или само действие.

Как это исправить:

  1. Передайте действие в конструктор класса
  2. Найдите представление по контексту действия
public class GradientTabbedPageRenderer : TabbedPageRenderer
{
    public YourHolderActivity _yourHolderActivity;
    
    public GradientTabbedPageRenderer(YourHolderActivity yourHolderActivity, Context context) : base(context) 
    {
        _yourHolderActivity = yourHolderActivity;
    }

    protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
    {
        base.OnElementChanged(e);

        var control = (GradientTabbedPage)Element;

        var tabs = _yourHolderActivity.FindViewById<BottomNavigationView>(Resource.Id.bottomtab_tabbar);
        if (tabs == null) return;

        tabs.SetBackground(new GradientDrawable(GradientDrawable.Orientation.LeftRight,
            new int[] { control.TopColor.ToAndroid(), control.BottomColor.ToAndroid() }));
    }
}
...