Проблема створення Android-розташування з прокруткою таблиці, якому слідує фіксоване розташування з кнопкою, виникає відносно часто. Деякі розробники можуть намагатися вирішити це, використовуючи ConstraintLayout і LinearLayout, але зустрічаються з труднощами, такими як зникнення LinearLayout або неправильне розташування кнопки. У цій статті ми розглянемо, як вирішити цю проблему та створити статичне рішення за допомогою лише XML-розмітки.
Мета полягає в створенні прокрутної таблиці змінної довжини, за якою завжди буде слідувати LinearLayout, що містить кнопку, розташовану внизу. Для досягнення цієї мети ми спочатку спробуємо використати ConstraintLayout, а потім розглянемо проблеми, з якими можна зіткнутися, і розв’язки для них.
У нашому випадку ми спробуємо створити макет з ConstraintLayout, який містить прокрутний TableLayout, за яким слідує LinearLayout з кнопкою. Ось спрощений код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/B2" android:orientation="vertical"> <ScrollView android:id="@+id/S1" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="vertical" android:layout_weight="0"> <TableLayout android:id="@+id/table" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TableRow >...</TableRow> <TableRow >...</TableRow> <TableRow >...</TableRow> </TableLayout> </ScrollView> <LinearLayout>.....</LinearLayout> </LinearLayout> <Button android:id="@+id/B2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="validate" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> |
Проблема з цим кодом полягає в тому, що LinearLayout може зникнути, якщо таблиця стає занадто довгою, або він може залишитися недалеко від кнопки, незалежно від розміру таблиці. Одним з можливих рішень цієї проблеми є використання OnPreDrawListener для динамічного вирішення проблеми, проте ми шукаємо статичне рішення з використанням лише XML-розмітки.
Приступимо до вирішення цієї проблеми, почавши зі створення статичного рішення за допомогою ConstraintLayout і LinearLayout. Потім ми розглянемо можливі варіанти використання другорядних Layouts, таких як RelativeLayout і FrameLayout, для досягнення бажаного результату.
Щоб вирішити проблему з зникненням LinearLayout, коли таблиця стає занадто довгою, ми можемо використати атрибут layout_constrainedHeight=”true” для LinearLayout. Це забезпечить те, що LinearLayout завжди буде видимим, навіть якщо таблиця буде прокручуватися. Ось змінений код:
1 2 3 4 5 6 7 8 9 |
<LinearLayout android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/B2" android:orientation="vertical" android:layout_constrainedHeight="true"> </LinearLayout> |
З цим зміненим атрибутом LinearLayout завжди буде видимим, навіть якщо таблиця прокручується, тому проблема з його зникненням вирішена. Проте є ще одна проблема: розташування кнопки. Навіть з вищезгаданими змінами, кнопка може залишатися недалеко від таблиці, а не внизу екрану.
Для вирішення цієї проблеми ми можемо скористатися атрибутом layout_constraintVertical_bias, який вказує, як далеко від вертикальної країни розташування має бути відповідний елемент. Якщо встановити цей атрибут для кнопки, ми можемо забезпечити його фіксоване розташування внизу екрану. Ось змінений код кнопки:
1 2 3 4 5 6 7 |
<Button android:id="@+id/B2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="validate" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintVertical_bias="1" /> |
З використанням цього атрибуту кнопка завжди буде розташована внизу екрану, навіть якщо таблиця занадто довга. Отже, проблема з неправильним розташуванням кнопки також вирішена.
Отже, за допомогою атрибутів layout_constrainedHeight і layout_constraintVertical_bias ми змогли створити статичне рішення для прокрутної таблиці, якому слідує фіксоване розташування з кнопкою. Це дозволяє нам досягти бажаного результату, використовуючи лише XML-розмітку, без необхідності використовувати OnPreDrawListener.
Хоча існують інші можливості розв’язання цієї проблеми, використання ConstraintLayout та відповідних атрибутів є простим та ефективним способом досягнення бажаного результату.