Xamarin: добавить представление в RelativeLayout с помощью цикла - PullRequest
0 голосов
/ 04 мая 2019

У меня странная проблема с кодом (я поместил здесь только важные строки):

...
RelativeLayout r;
Image[] ims
...

{ 
  r = FindByName<RelativeLayout>("relforimages"); 
  float width = 400f, height = 300f; 
  ims = new Image[2]; 

  for (int i = 0; i < 2 ; i++) { 
      ims[i] = new Image { <br>
              Aspect = Aspect.AspectFit, 
              HorizontalOptions = LayoutOptions.Center,
               VerticalOptions = LayoutOptions.Center
               };
      ims[i].Source = ImageSource.FromFile(localPathyn);
      ims[i].HeightRequest = 70; 
      r.Children.Add(ims[i], ()=> new Rectangle(width * i * 0.1f,  
           height * i *  0.1f, 
      70f, 70f));
      }


После этого я вижу только последнее изображение в RelativeLayout.Даже я увеличиваю количество изображений до 10 (например), ничего не происходит - я вижу только ПОСЛЕДНЕЕ изображение, но если добавить два или три представления с одинаковыми параметрами, но не из массива (Image []) - все работает правильно.

Вопрос: возможно ли (в xmarin) использовать элемент массива для динамического добавления представления в макет?если это возможно - какую ошибку я делаю?

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Это решение для Android. Конечно, если мы используем ImageView, у нас есть поле .Id для генерации уникального идентификатора для идентификации представления.

Другой код, без LayoutParameter, но с отдельными переменными работает корректно на всех мобильных телефонах:

    Image img1, img2, img3, img4;
            img1 = new Image();
            img2 = new Image();
            img3 = new Image();
            img4 = new Image();
            setImageParm(img1, 0, localPathyn);
            setImageParm(img2, 1, localPathyn);
            setImageParm(img3, 2, localPathyn);
            setImageParm(img4, 3, localPathyn);

    void setImageParm( Image im, int i, string localPathyn) {
                im.Aspect = Aspect.AspectFit;
                im.HorizontalOptions = LayoutOptions.Center;
                im.VerticalOptions = LayoutOptions.Center;
                im.Source = ImageSource.FromFile(localPathyn);
                im.HeightRequest = 70; 

                r.Children.Add(im, ()=> new Rectangle(width* i * 0.1f, height* i * 0.1f, 70f, 70f));
    }

Я думаю, что метод Children.Add использует идентификацию по x: имя, которое недоступно для изменения кода xamarin, и мы должны написать этот код отдельно для каждой платформы?

0 голосов
/ 05 мая 2019

Это потому, что вы используете правила RelativeLayout без параметров Layout Parameter, чтобы поместить каждое последующее изображение ниже предыдущего.А без этого изображения складываются друг на друга.Просто так получилось, что ваше самое большое изображение является последним размещенным на экране, и оно скрывает другие изображения.

Вот пример, который я собрал, используя массив ImageView в Xamarin.Android с соответствующими LayoutRules дляпокажите, что он работает правильно:

protected override void OnCreate(Bundle savedInstanceState) {
    base.OnCreate(savedInstanceState);

    var rl = new RelativeLayout(this);
    var iv = new ImageView[5];

    for (int i = 0; i < iv.Length; i++) {
        iv[i] = new ImageView(this);
        iv[i].SetImageResource(Resource.Drawable.Icon);
        iv[i].Id = View.GenerateViewId();
        var ivParms = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent);
        if (i == 0)
            ivParms.AddRule(LayoutRules.AlignTop);      // Apply to 1st image only
        else
            ivParms.AddRule(LayoutRules.Below, iv[i-1].Id);  // This is only to be applied to the 2nd and subsequent images
        iv[i].LayoutParameters = ivParms;
        rl.AddView(iv[i]);
    }

    SetContentView(rl);
}

Вывод

Output

Надеюсь, это поможет!

...