Как программно добавлять представления в представления
Допустим, у меня есть 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);