У меня есть ImageView, который инициализируется и программно добавляется в пользовательское представление, производное от LinearLayout.Пользовательский вид ссылается в макете XML.
Ресурс изображения устанавливается с помощью SetImageResource, и его контейнер состояние просмотра изначально невидимо (я также пробовал с состоянием пропущенного просмотра).
После возникновения события, видимость контейнера установлена в состояние видимого представления в главном потоке пользовательского интерфейса.
Ожидается
Я ожидаю, что изображение будет отображаться правильно после того, как контейнервидимость установлена на видимое, но я не могу видеть изображение.
Фактический
Если я установлю начальное состояние просмотра контейнера как невидимое, то когдавидимость переключается видимым, я вижу, что ImageView принимает ожидаемую ширину и высоту (с использованием границ макета), но без видимого изображения.
Если я установлю исходное состояние просмотра контейнера как пропавшее, то когдавидимость переключается видимым, я не вижу, чтобы ImageView занимал ожидаемую ширину и высоту (используя границы макета), а изображение не было видно.
Почему изображение ImageView nне появляется при установке видимости контейнера LinearLayout на видимое?
Ниже приведен мой пользовательский класс (изображение с двумя заголовками, отображаемыми под ним):
using System;
using System.Linq.Expressions;
using Android.Content;
using Android.Content.Res;
using Android.Graphics;
using Android.Graphics.Drawables;
using Android.Runtime;
using Android.Support.V4.Content;
using Android.Support.V7.Widget;
using Android.Util;
using Android.Views;
using Android.Widget;
using Orientation = Android.Widget.Orientation;
namespace ShrimpleSearch.Components
{
public class CaptionImageView : LinearLayout
{
private static TypedArray ReadStyleAttributes(
Context context
, IAttributeSet attributeSet
) => context.ObtainStyledAttributes(
attributeSet
, Resource.Styleable.CaptionImageView
, 0
, 0
);
private static int GetImageResource(
TypedArray styleAttributes
) => styleAttributes.GetResourceId(
Resource.Styleable.CaptionImageView_drawableSrc
, 0
);
private static float GetDrawableMarginBottom(
TypedArray styleAttributes
) => styleAttributes.GetDimensionPixelSize(
Resource.Styleable.CaptionImageView_drawableMarginBottom
, 0
);
private static Color GetPrimaryTextColor(
TypedArray styleAttributes
) => styleAttributes.GetColor(
Resource.Styleable.CaptionImageView_primaryTextColor
, Color.Black
);
private static string GetPrimaryText(
TypedArray styleAttributes
) => styleAttributes.GetString(Resource.Styleable.CaptionImageView_primaryText);
private static Typeface GetPrimaryFontFamily(
TypedArray styleAttributes
) => styleAttributes.GetFont(Resource.Styleable.CaptionImageView_primaryTextFontFamily);
private static float GetPrimaryLetterSpacing(
TypedArray styleAttributes
) => styleAttributes.GetFloat(
Resource.Styleable.CaptionImageView_primaryLetterSpacing
, 0f
);
private static float GetPrimaryTextSize(
TypedArray styleAttributes
) => styleAttributes.GetDimensionPixelSize(
Resource.Styleable.CaptionImageView_primaryTextSize
, 0
);
private static float GetPrimaryTextBottomMargin(
TypedArray styleAttributes
) => styleAttributes.GetDimensionPixelSize(
Resource.Styleable.CaptionImageView_primaryTextBottomMargin
, 0
);
private static Color GetSecondaryTextColor(
TypedArray styleAttributes
) => styleAttributes.GetColor(
Resource.Styleable.CaptionImageView_secondaryTextColor
, Color.Black
);
private static float GetSecondaryLetterSpacing(
TypedArray styleAttributes
) => styleAttributes.GetFloat(
Resource.Styleable.CaptionImageView_secondaryLetterSpacing
, 0f
);
private static float GetSecondaryTextSize(
TypedArray styleAttributes
) => styleAttributes.GetDimensionPixelSize(
Resource.Styleable.CaptionImageView_secondaryTextSize
, 0
);
private static float GetSecondaryTextHorizontalPadding(
TypedArray styleAttributes
) => styleAttributes.GetDimensionPixelSize(
Resource.Styleable.CaptionImageView_secondaryTextHorizontalPadding
, 0
);
private static Typeface GetSecondaryFontFamily(
TypedArray styleAttributes
) => styleAttributes.GetFont(Resource.Styleable.CaptionImageView_secondaryTextFontFamily);
private static string GetSecondaryText(
TypedArray styleAttributes
) => styleAttributes.GetString(Resource.Styleable.CaptionImageView_secondaryText);
private static float GetPrimaryTextLineSpacing(
TypedArray styleAttributes
) => styleAttributes.GetFloat(Resource.Styleable.CaptionImageView_primaryTextLineSpacing, 1f);
private static float GetSecondaryTextLineSpacing(
TypedArray styleAttributes
) => styleAttributes.GetFloat(Resource.Styleable.CaptionImageView_secondaryTextLineSpacing, 1f);
private static AppCompatImageView CreateImageView(
Context context
, TypedArray styleAttributes
, IAttributeSet attributeSet
)
{
var layoutParameters = new LayoutParams(
ViewGroup.LayoutParams.MatchParent
, ViewGroup.LayoutParams.WrapContent
) {Weight = 1};
layoutParameters.SetMargins(
0
, 0
, 0
, (int) GetDrawableMarginBottom(styleAttributes)
);
var imageView = new AppCompatImageView(context, attributeSet)
{
Id = GenerateViewId(),
LayoutParameters = layoutParameters
};
imageView.SetImageResource(GetImageResource(styleAttributes));
return imageView;
}
private static AppCompatTextView CreatePrimaryCaptionTextView(Context context, TypedArray styleAttributes)
{
var layoutParams = new LayoutParams(
ViewGroup.LayoutParams.MatchParent
, ViewGroup.LayoutParams.WrapContent
) {Weight = 0};
layoutParams.SetMargins(
0
, 0
, 0
, (int) GetPrimaryTextBottomMargin(styleAttributes)
);
var textView = new LetterSpacingTextView(context)
{
Id = GenerateViewId(),
Text = GetPrimaryText(styleAttributes),
LetterSpacing = GetPrimaryLetterSpacing(styleAttributes),
TextAlignment = TextAlignment.Center,
Typeface = GetPrimaryFontFamily(styleAttributes),
LayoutParameters = layoutParams
};
textView.SetLineSpacing(0, GetPrimaryTextLineSpacing(styleAttributes));
textView.SetTextSize(ComplexUnitType.Px, GetPrimaryTextSize(styleAttributes));
textView.SetTextColor(GetPrimaryTextColor(styleAttributes));
return textView;
}
private static AppCompatTextView CreateSecondaryCaptionTextView(Context context, TypedArray styleAttributes)
{
var layoutParams = new LayoutParams(
ViewGroup.LayoutParams.MatchParent
, ViewGroup.LayoutParams.WrapContent
) {Weight = 0};
var horizontalPadding = (int) GetSecondaryTextHorizontalPadding(styleAttributes);
layoutParams.SetMargins(
horizontalPadding
, 0
, horizontalPadding
, 0
);
var textView = new LetterSpacingTextView(context)
{
Id = GenerateViewId(),
Text = GetSecondaryText(styleAttributes),
LetterSpacing = GetSecondaryLetterSpacing(styleAttributes),
TextAlignment = TextAlignment.Center,
Typeface = GetSecondaryFontFamily(styleAttributes),
LayoutParameters = layoutParams
};
textView.SetLineSpacing(0, GetSecondaryTextLineSpacing(styleAttributes));
textView.SetTextSize(ComplexUnitType.Px, GetSecondaryTextSize(styleAttributes));
textView.SetTextColor(GetSecondaryTextColor(styleAttributes));
return textView;
}
protected CaptionImageView(
IntPtr javaReference
, JniHandleOwnership transfer
) : base(javaReference, transfer) => Expression.Empty();
public CaptionImageView(Context context) : base(context) => Expression.Empty();
public CaptionImageView(
Context context
, IAttributeSet attrs
) : base(context, attrs) => Init(context, attrs);
public CaptionImageView(
Context context
, IAttributeSet attrs
, int defStyleAttr
) : base(context, attrs,
defStyleAttr) => Init(context, attrs);
public CaptionImageView(
Context context
, IAttributeSet attrs
, int defStyleAttr
, int defStyleRes
) : base(context, attrs, defStyleAttr, defStyleRes) => Init(context, attrs);
private void Init(Context context, IAttributeSet attrs)
{
var styleAttributes = ReadStyleAttributes(context, attrs);
var imageView = CreateImageView(context, styleAttributes, attrs);
var primaryCaptionTextView = CreatePrimaryCaptionTextView(context, styleAttributes);
var secondaryCaptionTextView = CreateSecondaryCaptionTextView(context, styleAttributes);
Orientation = Orientation.Vertical;
AddView(imageView);
AddView(primaryCaptionTextView);
AddView(secondaryCaptionTextView);
}
}
}