Добавление компонентов во фрагмент во время выполнения в Android studio

#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 .