Настройка свойств макета в коде во время выполнения

#xamarin.android

#xamarin.android

Вопрос:

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

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

android: layout_alignParentBottom=»true» android:layout_alignParentRight=»true» android:layout_weight=»1″

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

Ответ №1:

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

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

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

Из-за этого атрибуты могут быть (и будут) специфичными для данного типа. Например, насколько я могу судить по быстрому просмотру исходного кода Android, недопустимо, чтобы тип имел оба атрибута android:layout_alignParentBottom и android:layout_weight , поскольку android:layout_alignParentBottom, похоже, специфичен для RelativeLayout типа, в то время как 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.Параметры макета.Добавьте метод для включения параметра макета. int Приведение необходимо, потому что мы не понимали, что это AddRule() должно принимать LayoutRules перечисление; упс.

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

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

Как отмечалось выше, похоже, что android:layout_weight специфичен для LinearLayout , поэтому мы не можем использовать RelativeLayout.LayoutParams для установки этого. Вместо этого нам нужно использовать LinearLayout.LayoutParams для установки LinearLayout.Параметры макета.Свойство 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;