Установка свойств макета в коде во время выполнения - PullRequest
0 голосов
/ 27 апреля 2011

У меня проблемы с поиском, как установить свойства макета в моем коде.Мои элементы управления создаются во время выполнения, поэтому я не могу установить макет в своем XML.

Я хотел бы иметь возможность устанавливать свойства, такие как

android: layout_alignParentBottom = "true" android: layout_alignParentRight = "true" android: layout_weight = "1"

Однако я не могу найти документацию или примеры того, как это сделать в коде.Возможно ли это с текущей версией Mono для Android?

1 Ответ

10 голосов
/ 28 апреля 2011

Соответствующая тема в списке рассылки Mono for Android.

Многие из конструкторов принимают экземпляр IAttributeSet , поэтому (в худшем случае) вы всегда можете предоставить пользовательские атрибуты XML через этот параметр при вызове, например, Конструктор RelativeLayout (Context, IAttributeSet) .

Атрибуты ресурса обрабатываются конкретно в коде Java и, таким образом, потенциально могут варьироваться от одного класса к другому. Например, реализация конструктора RelativeLayout .

Из-за этого атрибуты могут (и будут) быть специфичными для данного типа. Например, насколько я могу судить по быстрому просмотру источника Android, недопустимо, чтобы тип имел атрибуты android:layout_alignParentBottom и android:layout_weight, поскольку android: layout_alignParentBottom , по-видимому, специфичен для RelativeLayout type, тогда как android: layout_weight относится к LinearLayout , и между RelativeLayout и LinearLayout.

нет никаких отношений наследования.

Тем не менее, чтобы программно назначить свойство android:layout_alignParentBottom, похоже, что вы захотите сделать:

// Get a RelativeLayout.LayoutParams instance
// Option 1, if you have an existing RelativeLayout instance already:
var p = (RelativeLayout.LayoutParams) layout.LayoutParameters;

// Option 2: if you don't.
var p = new RelativeLayout.LayoutParams (context, null);

// Enable layout_alignParentBottom:
p.AddRule ((int) LayoutRules.AlignParentBottom);

Используется метод RelativeLayout.LayoutParams.AddRule , чтобы включить параметр макета. Приведение int необходимо, потому что мы не понимали, что AddRule() должно принимать перечисление LayoutRules; упс.

Чтобы программно назначить свойство android:layout_alignParentRight:

p.AddRule ((int) LayoutRules.AlignParentRight);

Как отмечалось выше, похоже, что android: layout_weight относится к LinearLayout, поэтому мы не можем использовать RelativeLayout.LayoutParams для установки этого. Вместо этого нам нужно использовать LinearLayout.LayoutParams для установки свойства LinearLayout.LayoutParams.Weight :

// Just like before, but get a LinearLayout.LayoutParams instance
// Option 1, if you have an existing LinearLayout instance already:
var p = (LinearLayout.LayoutParams) layout.LayoutParameters;

// Option 2: if you don't.
var p = new LinearLayout.LayoutParams (context, null);

// Enable layout_weight:
p.Weight = 1.0f;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...