Как программно добавлять представления в представления

Допустим, у меня есть LinearLayout, и я хочу добавить к нему представление в моей программе из кода Java. Какой метод используется для этого? Я не спрашиваю, как это делается в XML, который я знаю, но, скорее, как я могу сделать что-то в соответствии с этим примером кода?

(One View).add(Another View)

Как можно сделать в Swing.

Ответ 1

Вызов addView - правильный ответ, но вам нужно сделать немного больше, чтобы заставить его работать.

Если вы создаете представление через конструктор (например, Button myButton = new Button();), вам нужно вызвать setLayoutParams во вновь созданное представление, передав в экземпляр родительского представления LayoutParams внутренний класс, прежде чем вы добавите свой вновь построенный дочерний элемент к родительскому виду.

Например, у вас может быть следующий код в вашей функции onCreate(), если ваш LinearLayout имеет id R.id.main:

LinearLayout myLayout = findViewById(R.id.main);

Button myButton = new Button(this);
myButton.setLayoutParams(new LinearLayout.LayoutParams(
                                     LinearLayout.LayoutParams.MATCH_PARENT,
                                     LinearLayout.LayoutParams.MATCH_PARENT));

myLayout.addView(myButton);

Важно, чтобы установить LayoutParams. Для каждого представления требуется, по крайней мере, параметр layout_width и параметр layout_height. Также важно получить правильный внутренний класс. Я изо всех сил пытался получить Views добавлен в TableRow для правильной отображения, пока не понял, что я не передавал экземпляр TableRow.LayoutParams для дочернего представления setLayoutParams.

Ответ 2

для всех, кто еще заинтересован:

лучший способ, который я нашел, - использовать статический метод накачки View.

View inflatedView = View.inflate(context, yourViewXML, yourLinearLayout);

где yourViewXML - это что-то вроде R.layout.myView

обратите внимание, что вам нужна ViewGroup, чтобы добавить представление (это любой макет, о котором вы можете думать)

так что в примере можно сказать, что у вас есть фрагмент, который он видит уже завышенным, и вы знаете, что корневой вид является макетом, и вы хотите добавить к нему представление:

    View view = getView(); // returns base view of the fragment
    if (view == null)
        return;
    if (!(view instanceof ViewGroup))
        return;

    ViewGroup viewGroup = (ViewGroup) view;
    View popup = View.inflate(viewGroup.getContext(), R.layout.someView, viewGroup);

Ответ 3

LinearLayout является подклассом ViewGroup, который имеет метод addView. Метод addView должен быть тем, что вам нужно.

Ответ 4

Это поздно, но это может помочь кому-то:):) Для добавления вида программным способом попробуйте

LinearLayout rlmain = new LinearLayout(this);      
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);          
LinearLayout   ll1 = new LinearLayout (this);

ImageView iv = new ImageView(this);
iv.setImageResource(R.drawable.logo);              
LinearLayout .LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);

iv.setLayoutParams(lp);
ll1.addView(iv);
rlmain.addView(ll1);              
setContentView(rlmain, llp);

Это создаст весь ваш просмотр программно. Вы можете добавить любое количество просмотров одинаково. Надеюсь, это поможет.:)

Ответ 5

Еще один способ добавить вид из Activity

ViewGroup rootLayout = findViewById(android.R.id.content);
rootLayout.addView(view);

Ответ 6

Идея программной установки ограничений может быть утомительной. Это решение ниже будет работать для любого макета, будь то ограничение, линейное и т.д. Лучшим способом было бы установить заполнитель, т.е. 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>

Кстати, установите параметры макета вашего 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);