#android #android-layout #android-fragments #layout-inflater
#Android #android-макет #android-фрагменты #макет-надуватель
Вопрос:
Я изо всех сил пытался найти подходящий ответ о том, как добавлять компоненты в макет во фрагменте во время выполнения в Android studio.
В частности:
У меня есть класс A, который загружает и анализирует XML-файл. Фрагмент B создает экземпляр этого класса A и должен отображать эти загруженные элементы. (пока только текстовое представление)
Это XML-файл, в котором должен отображаться TextView. Элементы должны отображаться в двух столбцах. Я знаю, как создать макет в XML-файле, но я понятия не имею, как это сделать программно. Я также читал кое-что о надувателях, но я не знаю, подходит ли это для этой цели.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableRow
android:layout_width="match_parent"
android:layout_height="0dp"
android:paddingTop="10dp">
<TextView
android:id="@ id/columnItem"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="5dp"
android:layout_marginStart="5dp"
android:layout_weight=".5"
android:background="#c5c5c5"
android:gravity="center"
android:text="@string/CategoryLeft" />
</TableRow>
</ScrollView>
</TableLayout>
Итак, вот код во фрагменте B, который в настоящее время просто изменяет текст двух существующих текстовых представлений, который работает просто отлично.
public void onStart() {
super.onStart();
ArrayList<String> categories = new ArrayList<>();
XMLHandler getXML = new XMLHandler();
getXML.execute();
categories = getXML.getCategories();
Iterator<String> it = categories.iterator();
while (it.hasNext()) {
System.out.println("Data is " it.next());
columnItem.setText(it.next());
}
}
Цель состоит в том, чтобы добавить новый TextView для каждой итерации через цикл while в родительский макет. В этом текстовом представлении должно отображаться содержимое it.next().
Заранее спасибо и дайте мне знать, если вам понадобится дополнительная информация.
Ответ №1:
Если вы хотите добавить TextView
в TableRow
.
Сначала добавьте идентификатор в TableRow
<TableRow
android:id="@ id/table1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:paddingTop="10dp">
Затем в вашем onCreate
tableRow = findViewById(R.id.table1); // tableRow is a global variable
добавьте пустоту в свой фрагмент
private void addTextView(String atext) {
TextView txt = new TextView(getActivity());
txt.setText(atext);
tableRow.addView(txt);
// here you can add other properties to the new TextView (txt)
}
и затем
public void onStart() {
super.onStart();
ArrayList<String> categories = new ArrayList<>();
XMLHandler getXML = new XMLHandler();
getXML.execute();
categories = getXML.getCategories();
Iterator<String> it = categories.iterator();
while (it.hasNext()) {
String atxt = it.next();
System.out.println("Data is " atxt);
addTextView(atxt);
}
}
Комментарии:
1. Спасибо, это сработало для меня. Если кто-то еще сталкивается с этой проблемой: при доступе к TableRow из фрагмента вам нужно вызвать
View view = inflater.inflate(R.layout.fragment_layout, container, false);
, а затемview.findViewById(R.id.table1);
в методе onCreateView вашего фрагмента, в противном случае вы получите исключение nullpointer .