Создание динамических макетов в 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.
1*fd6l3MvoU0aisR-StCTBCg.png

Как создавать динамические макеты

Простой макет в 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);
        } 

    }
}

Скриншот 25 февраля 2020 г., 22.32.20.png

Добавление свойств 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);

Полный исходный код:

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *