Android RelativeLayout孩子没有出现

Android RelativeLayout孩子没有出现,android,android-layout,xamarin,Android,Android Layout,Xamarin,我正在为android开发ActivityOverlay渲染器。不幸的是,“progressbar”视图没有正确显示 这是我目前的代码: internal class ViewImplementation : FormsViewGroup { private Framework.Controls.ActivityIndicatorOverlay _element; private FormsElementWrapper _displayView;

我正在为android开发ActivityOverlay渲染器。不幸的是,“progressbar”视图没有正确显示

这是我目前的代码:

internal class ViewImplementation : FormsViewGroup
    {
        private Framework.Controls.ActivityIndicatorOverlay _element;
        private FormsElementWrapper _displayView;
        private RelativeLayout _overlay;
        private ProgressBar _indicator;

        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            if (!disposing)
                return;

            this._displayView = null;
            this._element = null;
            this._overlay = null;
            this._indicator = null;

            RemoveAllViews();
        }

        public ViewImplementation(Framework.Controls.ActivityIndicatorOverlay element, Context context) : base(context)
        {
            _element = element;
            EnsureChildLayers();
        }

        public void OnElementPropertyChanged(object sender, PropertyChangedEventArgs args)
        {
            if (_displayView == null || _overlay == null)
                return;

            switch (args.PropertyName)
            {
                case nameof(Framework.Controls.ActivityIndicatorOverlay.IsBusy):
                    UpdateIsBusy();
                    break;
                case nameof(Framework.Controls.ActivityIndicatorOverlay.Width):
                case nameof(Framework.Controls.ActivityIndicatorOverlay.Height):
                case nameof(Framework.Controls.ActivityIndicatorOverlay.OverlayBackgroundColor):
                    UpdateBackgroundColor();
                    break;
                case nameof(Framework.Controls.ActivityIndicatorOverlay.ActivityColor):
                    UpdateIndicatorColor();
                    break;
            }
        }

        protected override void OnLayout(bool changed, int left, int top, int right, int bottom)
        {
            base.OnLayout(changed, left, top, right, bottom);

            _overlay.Layout(left, top, right, bottom);
            //          _indicator.Layout(left-200, top - 200, right - 200, bottom - 200);
//          _indicator.Layout(left, top, right, bottom);
            _displayView.Layout(left, top, right, bottom);
        }

        private void UpdateBackgroundColor()
        {
            _overlay.SetBackgroundColor(_element.OverlayBackgroundColor.ToAndroid());
        }

        private void UpdateIsBusy()
        {
            if (_element.IsBusy)
            {
                _overlay.Visibility = ViewStates.Visible;
            }
            else
            {
                _overlay.Visibility = ViewStates.Invisible;
            }
        }

        private void UpdateIndicatorColor()
        {
            if (Build.VERSION.SdkInt < BuildVersionCodes.Lollipop)
                return;

            this._indicator.IndeterminateDrawable.SetColorFilter(this._element.ActivityColor.ToAndroid(), PorterDuff.Mode.SrcIn);
        }

        private void EnsureChildLayers()
        {
            if (_displayView != null)
                return;

            _displayView = new FormsElementWrapper(_element.Content);
            this.AddView(_displayView);
            _indicator = new ProgressBar(this.Context);
            _indicator.Indeterminate = true;
            _indicator.ForceLayout();
            _overlay = new RelativeLayout(this.Context);
            _overlay.SetHorizontalGravity(GravityFlags.Center);
            _overlay.SetVerticalGravity(GravityFlags.Center);
            _overlay.AddView(_indicator, new LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent));
            this.AddView(_overlay);

            UpdateBackgroundColor();
            UpdateIndicatorColor();
            UpdateIsBusy();
        }
    }
内部类视图实现:FormsViewGroup
{
private Framework.Controls.ActivityIndicator RoverLay元素;
私有窗体SelementRapper\u显示视图;
私人关系覆盖;
专用进度条(u)指示器;;
受保护的覆盖无效处置(布尔处置)
{
基地。处置(处置);
如果(!处理)
返回;
这是。_displayView=null;
此._元素=null;
这是._overlay=null;
此参数为空;
移除所有视图();
}
公共视图实现(Framework.Controls.ActivityIndicatorRoverLay元素,上下文):基础(上下文)
{
_元素=元素;
确保山区居民();
}
public void OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs参数)
{
如果(_displayView==null | | | u overlay==null)
返回;
开关(args.PropertyName)
{
案例名称(Framework.Controls.ActivityIndicatorOverlay.IsBusy):
UpdatesBusy();
打破
案例名称(Framework.Controls.ActivityIndicatorRoverLay.Width):
案例名称(Framework.Controls.ActivityIndicatorRoverLay.Height):
案例名称(Framework.Controls.ActivityIndicatorRoverLay.OverlyBackgroundColor):
UpdateBackgroundColor();
打破
案例名称(Framework.Controls.ActivityIndicatorRoverLay.ActivityColor):
UpdateIndicatorColor();
打破
}
}
受保护覆盖仅限无效布局(布尔值已更改、整数左侧、整数顶部、整数右侧、整数底部)
{
基础。仅限布局(已更改、左侧、顶部、右侧、底部);
_覆盖。布局(左、上、右、下);
//_指示器布局(左-200、上-200、右-200、下-200);
//_指示器布局(左、上、右、下);
_displayView.布局(左、上、右、下);
}
私有void UpdateBackgroundColor()
{
_overlay.SetBackgroundColor(_元素.OverlayBackgroundColor.ToAndroid());
}
私有void updatesBusy()
{
if(_element.IsBusy)
{
_overlay.Visibility=ViewStates.Visible;
}
其他的
{
_overlay.Visibility=ViewStates.Invisible;
}
}
私有void UpdateIndicatorColor()
{
if(Build.VERSION.SdkInt
我希望视图以最小尺寸居中显示,这是通过
\u overlay.AddView(\u指示符,new LayoutParams(LayoutParams.WrapContent,LayoutParams.WrapContent))

但是,除非我执行
\u指示器布局(左、上、右、下)(使用自己计算的值)我根本无法显示进度视图。然而,在我看来,如果我在这里进行计算,我似乎做错了什么,因为从相对的应用规范来看,这应该是不需要任何计算就可以做到的


有人能在这里发现错误吗?

此版本有效。至于为什么我不能让另一个版本按我所希望的方式工作,我仍然一无所知。但至少它现在可以工作了。仍然对原因感到好奇

internal class ViewImplementation : RelativeLayout
{
    private Framework.Controls.ActivityIndicatorOverlay _element;
    private FormsElementWrapper _displayView;
    private RelativeLayout _overlay;
    private ProgressBar _indicator;

    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);
        if (!disposing)
            return;

        this._displayView = null;
        this._element = null;
        this._overlay = null;
        this._indicator = null;

        RemoveAllViews();
    }

    public ViewImplementation(Framework.Controls.ActivityIndicatorOverlay element, Context context) : base(context)
    {
        _element = element;
        EnsureChildLayers();
    }

    public void OnElementPropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        if (_displayView == null || _overlay == null)
            return;

        switch (args.PropertyName)
        {
            case nameof(Framework.Controls.ActivityIndicatorOverlay.IsBusy):
                UpdateIsBusy();
                break;
            case nameof(Framework.Controls.ActivityIndicatorOverlay.Width):
            case nameof(Framework.Controls.ActivityIndicatorOverlay.Height):
            case nameof(Framework.Controls.ActivityIndicatorOverlay.OverlayBackgroundColor):
                UpdateBackgroundColor();
                break;
            case nameof(Framework.Controls.ActivityIndicatorOverlay.ActivityColor):
                UpdateIndicatorColor();
                break;
        }
    }

    private void UpdateBackgroundColor()
    {
        _overlay.SetBackgroundColor(_element.OverlayBackgroundColor.ToAndroid());
    }

    private void UpdateIsBusy()
    {
        if (_element.IsBusy)
        {
            _overlay.Visibility = ViewStates.Visible;
        }
        else
        {
            _overlay.Visibility = ViewStates.Invisible;
        }
    }

    private void UpdateIndicatorColor()
    {
        if (Build.VERSION.SdkInt < BuildVersionCodes.Lollipop)
            return;

        this._indicator.IndeterminateDrawable.SetColorFilter(this._element.ActivityColor.ToAndroid(), PorterDuff.Mode.SrcIn);
    }

    private void EnsureChildLayers()
    {
        if (_displayView != null)
            return;

        _displayView = new FormsElementWrapper(_element.Content);
        _displayView.LayoutParameters = new RelativeLayout.LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent);
        this.AddView(_displayView);
        _indicator = new ProgressBar(this.Context);
        var layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent);
        layoutParams.AddRule(LayoutRules.CenterInParent);
        _indicator.LayoutParameters = layoutParams;
        _indicator.Indeterminate = true;
        _overlay = new RelativeLayout(this.Context);
        _overlay.LayoutParameters = new RelativeLayout.LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent);
        _overlay.AddView(_indicator);

        this.AddView(_overlay);

        UpdateBackgroundColor();
        UpdateIndicatorColor();
        UpdateIsBusy();
    }
}
内部类视图实现:RelativeLayout
{
private Framework.Controls.ActivityIndicator RoverLay元素;
私有窗体SelementRapper\u显示视图;
私人关系覆盖;
专用进度条(u)指示器;;
受保护的覆盖无效处置(布尔处置)
{
基地。处置(处置);
如果(!处理)
返回;
这是。_displayView=null;
此._元素=null;
这是._overlay=null;
此参数为空;
移除所有视图();
}
公共视图实现(Framework.Controls.ActivityIndicatorRoverLay元素,上下文):基础(上下文)
{
_元素=元素;
确保山区居民();
}
public void OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs参数)
{
如果(_displayView==null | | | u overlay==null)
返回;
开关(args.PropertyName)
{
案例名称(Framework.Controls.ActivityIndicatorOverlay.IsBusy):
UpdatesBusy();
打破
案例名称(Framework.Controls.ActivityIndicatorRoverLay.Width):
案例名称(Framework.Controls.ActivityIndicatorRoverLay.Height):
案例名称(Framework.Controls.ActivityIndicatorRoverLay.OverlyBackgroundColor):
UpdateBackgroundColor();