Android RelativeLayout孩子没有出现
我正在为android开发ActivityOverlay渲染器。不幸的是,“progressbar”视图没有正确显示 这是我目前的代码: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;
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();