Создание динамических макетов в Android
Как правило, мы разрабатываем макет приложения для Android, создавая XML-файл. Такие макеты называются статическими.
Вы спросите, статический? Да, потому что вы не можете добавлять/удалять какой-либо тип представления в XML во время выполнения.
Динамические макеты разрабатываются с использованием Java и могут использоваться для создания макетов, которые вы обычно создаете с помощью XML-файла.
Зачем они нам нужны?
Допустим, мы получаем некоторые данные с нашего сервера и хотим создать n полей/кнопок/параметров в нашем макете. Как это сделать, используя только XML? Вот так!
Но мы можем использовать Java для точного воспроизведения макета, который мы обычно создаем с помощью XML.
Его можно использовать для создания LinearLayout, ScrollView и т. д., которые могут дополнительно добавлять TextView, EditText, RadioButtons, Checkbox внутри него.
В чем преимущество динамических макетов?
Допустим, мы хотим показать некоторые элементы в нашем макете, которые часто покупаются вместе (все элементы имеют один и тот же тип просмотра).
Есть довольно много способов показать их в нашем макете:
1. Добавление статических представлений в наш XML (если мы знаем точное количество элементов).
2. Использование Recycler View для увеличения элементов в нашем макете.
3. Создание динамических представлений с помощью Java.
Что делать, если мы не знаем точное количество отображаемых элементов и наши
для макета требуются разные типы просмотра (например, 3 TextView, 2 CheckBox и т. д.)?
Возможные пути решения этой проблемы:
1. Добавление статических представлений в наш XML на этот раз не сработает, потому что мы этого не делаем. знать точное количество просмотров, которое нам нужно.
2. Использование Recycler View может работать, но одни и те же типы View должны быть сгруппированы вместе в списке. Гибкости в этом случае не так много.
3. Однако именно здесь динамические макеты берут на себя инициативу! Они гибки и могут добавлять несколько типов представления в наш макет в любом порядке.
Динамический макет, содержащий TextViews, CheckBoxes, RadioButtons, EditTexts.
Как создавать динамические макеты
Простой макет в XML, содержащий только TextViews
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="
xmlns:tools="
android:id="@+id/linear_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="TextView 1"
android:textSize="30dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="TextView 2"
android:textSize="30dp"/>
</LinearLayout>
Тот же динамический макет, созданный в Java
public class MainActivity extends AppCompatActivity {
LinearLayout linearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout = findViewById(R.id.linear_layout); //Adding 2 TextViews
for (int i = 1; i <= 2; i++) {
TextView textView = new TextView(this);
textView.setText("TextView " + String.valueOf(i));
linearLayout.addView(textView);
}
}
}
Добавление свойств ViewType в Java
Android предоставляет нам почти все возможные атрибуты, которые мы используем в нашем XML для наших типов представления.
Установка высоты и ширины нашего TextView
//height -> match_parent | width -> wrap_contentLinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);//Setting the above params to our TextView
textView.setLayoutParams(params);
Добавление полей в наш TextView
(margins are always applied to the params and not to the view directly)
LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);//Don't forget to set this param to your TextView
textView.setLayoutParams(params);
Добавление отступов к нашим TextViews
//Padding can be directly added to our views
textView.setPadding(left, top, right, bottom);
Полный исходный код: