Добавить горизонтальное и вертикальное отображение в LinearLayout динамически

Я хочу добавить динамический вид в горизонтальный LinearLayout. Но моя проблема заключается в том, что в горизонтальном положении нет места, которое должно автоматически размещаться по вертикали.

Мои изображения

Введите описание изображения здесь

Мой ожидаемый результат

Введите описание изображения здесь

Мои коды

for (int j = 0; j < jobDet.getKeywords().length; j++) { RelativeLayout tr_head = (RelativeLayout) getLayoutInflater().inflate(R.layout.tag_lay, null); TextView label_date = (TextView) tr_head.findViewById(R.id.tag_name); label_date.setText(jobDet.getKeywords()[j]); keywordL.addView(tr_head, new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); } 

Мой "tag_lay.xml"

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="30dp" android:id="@+id/tag_name" android:paddingLeft="10dp" android:paddingRight="10dp" android:background="@drawable/round_edit_box" android:text=" PHP " android:gravity="center" android:lines="1" android:layout_marginRight="5dp"/> </RelativeLayout> 

Вы не можете сделать это с помощью одиночного LinearLayout поскольку он имеет ориентацию LinearLayout или HORIZONTAL . Я бы предложил вам взглянуть на FlexboxLayout Google. Его библиотека, которая обеспечивает макет, где вы можете достичь аналогичного вида. Вы можете добавить эту библиотеку, добавив ниже строки в файл уровня графа приложения:

 compile 'com.google.android:flexbox:0.1.3' 

Вы можете изменить keywordL на FlexboxLayout из LinearLayout . Пример кода для компоновки контейнера может быть примерно следующим:

 <com.google.android.flexbox.FlexboxLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/flexbox_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:alignContent="flex_start" app:alignItems="flex_start" app:flexWrap="wrap"/> 

Вы можете изменить значение alignContent , alignItems и flexWrap соответствии с вашими требованиями. Хотя это должно работать, потому что оно работает для меня. Добавляя детей, вы можете сделать что-то вроде ниже:

 for (int j = 0; j < jobDet.getKeywords().length; j++) { RelativeLayout tr_head = (RelativeLayout) getLayoutInflater().inflate(R.layout.tag_lay, keywordL, false ); TextView label_date = (TextView) tr_head.findViewById(R.id.tag_name); label_date.setText(jobDet.getKeywords()[j]); keywordL.addView(tr_head); } 

Пожалуйста, дайте мне знать, если у вас есть проблемы с реализацией.