Я пытаюсь достичь следующего программно (а не декларативно через XML):
<RelativeLayout...>
<TextView ...
android:id="@+id/label1" />
<TextView ...
android:id="@+id/label2"
android:layout_below: "@id/label1" />
</RelativeLayout>
Другими словами, как сделать так, чтобы второе TextView
отображалось под первым, но я хочу сделать это в коде:
RelativeLayout layout = new RelativeLayout(this);
TextView label1 = new TextView(this);
TextView label2 = new TextView(this);
...
layout.addView(label1);
layout.addView(label2);
setContentView(layout);
Обновить:
Спасибо, TreeUK. Я понимаю общее направление, но оно все еще не работает - «Б» перекрывает «А». Что я делаю не так?
RelativeLayout layout = new RelativeLayout(this);
TextView tv1 = new TextView(this);
tv1.setText("A");
TextView tv2 = new TextView(this);
tv2.setText("B");
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT);
lp.addRule(RelativeLayout.RIGHT_OF, tv1.getId());
layout.addView(tv1);
layout.addView(tv2, lp);
Ответы:
Из того, что я смог собрать вместе, вы должны добавить представление, используя LayoutParams.
Вся заслуга в sechastain, чтобы программно позиционировать ваши предметы, вы должны назначить им идентификаторы.
затем
addRule(RelativeLayout.RIGHT_OF, tv1.getId());
источник
below
уже добавлено, как убедиться, что оно по-прежнему отображается правильно?addView
Насколько я понимаю, макет перерисовывается, поэтому, если я сделаю это для элемента, родственник которого еще не был добавлен, он вылетит, поскольку элемент с таким идентификатором еще не существует.Короче говоря, с относительной разметкой вы размещаете элементы внутри разметки.
создать новый RelativeLayout.LayoutParams
(что угодно ... заполнить родительский или перенос содержимого, абсолютные числа, если необходимо, или ссылку на ресурс XML)
Добавить правила: Правила относятся к родителю или другим «братьям» в иерархии.
Просто примените параметры макета: самый «здоровый» способ сделать это:
Остерегайтесь : не изменяйте макет из обратных вызовов макета. Это заманчиво, потому что это когда представления получают свои реальные размеры. Однако в этом случае ожидаются неожиданные результаты.
источник
parentLayout.addView(myView, lp
). Я всегда делал это в две строки кода. Спасибо!Просто провел 4 часа с этой проблемой. Наконец понял, что вы не должны использовать ноль в качестве идентификатора представления . Вы могли бы подумать, что это разрешено как NO_ID == -1, но если вы дадите это на ваше усмотрение, все пойдет не так ...
источник
Пример минимального запуска Android 22
Источник:
Работает с проектом по умолчанию, созданным
android create project ...
. GitHub репозиторий с минимальным кодом сборки .источник
TextView
? Я пытался и третийTextView
отсутствует.вызов
после
источник
Пытаться:
источник
Этот подход с ViewGroup.MarginLayoutParams работал для меня:
источник
источник
Если вы действительно хотите создать макет вручную, я бы посоветовал вообще не использовать стандартный макет. Сделайте все это самостоятельно, вот пример kotlin:
Это может дать вам представление о том, как это может работать
источник