Ідея програмного встановлення обмежень може бути стомлюючою. Це рішення нижче буде працювати для будь-якого макета, будь то обмеження, лінійне тощо. Найкращим способом було б встановити заповнювач, тобто FrameLayout з належними обмеженнями (або правильне розміщення в іншому макеті, наприклад, лінійному) у тому місці, де ви очікували б програмно створеного перегляду мати.
Все, що вам потрібно зробити, це надути подання програмно і це як дитина в FrameLayout за допомогою addChild()методу. Тоді під час виконання ваш погляд буде завищений і розміщений у правильному положенні. Згідно з рекомендацією для 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>
BTW, встановіть параметри макетів вашого 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в 3 - й параметр findViewById(). Детальніше про це читайте це .)