#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;