Идея программной установки ограничений может быть утомительной. Это решение ниже будет работать для любого макета, будь то ограничение, линейное и т. Д. Наилучшим способом было бы установить заполнитель, т.е. FrameLayout с надлежащими ограничениями (или надлежащим размещением в другом макете, например, линейном) в позиции, в которой вы ожидаете программно созданное представление. иметь.
Все, что вам нужно сделать, это раздувать представление программно и в детстве с помощью addChild()
метода FrameLayout . Тогда во время выполнения ваш вид будет раздут и помещен в правильное положение. Согласно рекомендациям Android, вы должны добавить только один дочерний элемент в FrameLayout [ссылка] .
Вот как будет выглядеть ваш код, если вы хотите программно создать TextView в определенной позиции:
Шаг 1:
В вашем макете, который будет содержать раздуваемое представление, поместите FrameLayout в правильное положение и присвойте ему идентификатор, скажем, «контейнер».
Шаг 2
Создайте макет с корневым элементом в качестве представления, которое вы хотите раздуть во время выполнения, вызовите файл макета как «textview.xml»:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
</TextView>
Кстати, установите параметры макета вашего frameLayout равными wrap_content, иначе макет кадра станет таким же большим, как родительский элемент, т.е. активность, то есть экран телефона.
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Если не задано, потому что дочерний вид рамки по умолчанию переходит в левую верхнюю часть макета кадра, поэтому ваш вид просто переместится в левую верхнюю часть экрана.
Шаг 3
В вашем методе oncreate сделайте это:
FrameLayout frameLayout = findViewById(R.id.container);
TextView textView = (TextView) View.inflate(this, R.layout.textview, null);
frameLayout.addView(textView);
(Обратите внимание, что установка последнего параметра findViewById
для null
и добавление представления путем вызова представления addView()
контейнера (frameLayout) - это то же самое, что просто присоединение раздутого представления путем передачи true
третьего параметра параметра findViewById()
. Для получения дополнительной информации см. Это .)