
Проблема створення 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 та відповідних атрибутів є простим та ефективним способом досягнення бажаного результату.