Вот мое решение:
public class MainActivity extends AppCompatActivity {
private static final int FIRST_ROW_ID = 100;
private static final int SECOND_ROW_ID = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout layoutContainer = findViewById(R.id.linear_layout_container);
View firstRow = getLayoutInflater().inflate(R.layout.layout_part, layoutContainer, false);
View secondRow = getLayoutInflater().inflate(R.layout.layout_part, layoutContainer, false);
firstRow.setId(FIRST_ROW_ID);
secondRow.setId(SECOND_ROW_ID);
layoutContainer.addView(firstRow);
layoutContainer.addView(secondRow);
EditText editText = firstRow.findViewById(R.id.edit1);
editText.setText("Hello");
EditText editText2 = secondRow.findViewById(R.id.edit1);
editText2.setText("World");
}
}
activity_main.xml
:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/linear_layout_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
</FrameLayout>
layout_part.xml
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:id="@+id/relative_layout"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/txtName1"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="TextView" />
<EditText
android:id="@+id/edit1"
android:layout_width="55dp"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_toEndOf="@id/txtName1"
android:ems="10"
android:inputType="number" />
<Switch
android:id="@+id/switch1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_toEndOf="@id/edit1" />
</RelativeLayout>
То, что я делаю здесь, относительнопросто: root layout (activity_main.xml)
просто определяет LinearLayout
.Это будет контейнер, содержащий все строки.
Чтобы создать строки без объявления каждого свойства с помощью кода Java, я извлек RelativeLayout
и поместил его в отдельный файл (layout_part.xml
).
Теперь в упражнении я просто инициализирую layoutContainer
, а затем inflate
layout of the row
так часто, как это необходимо.Обратите внимание, что третий параметр (attachToRoot
) имеет значение false getLayoutInflater().inflate(R.layout.layout_part, layoutContainer, false)
.
. Причина этого заключается в следующем: если задано значение true, компоновка будет немедленно добавлена к layoutContainer
и, следовательно,идентификаторы не будут уникальными (например, у вас будет несколько идентификаторов editText1).Поэтому я говорю инфлятору: эй, я сам добавлю эти Views
, как только буду готов.
Итак, как идентификаторы будут уникальными?Ну, просто назначьте разные идентификаторы для каждого из раздутых макетов.
После этого просто добавьте строки в layoutContainer
, а затем я просто установил текст на EditText
каждой строки, чтобы доказать, что это работает.
Вот и все!Если у вас есть дополнительные вопросы - просто спросите:)