Изображение не отображается при настройке ресурса изображения в ImageView, когда оно невидимо или пропало - PullRequest
0 голосов
/ 19 июня 2019

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